gpt4 book ai didi

clang - libtooling 找不到 stddef.h 或其他 header

转载 作者:行者123 更新时间:2023-12-01 22:38:15 32 4
gpt4 key购买 nike

我正在编写一个工具来解析 C 系列源代码项目,基本上遵循这两个教程 1 2在 ubuntu 12.04 上的 clang 3.4 (trunk 192426) 上。

基于offical tutorial ,它说我可以通过 -p 传递 compile_commands.json,但是,如果我只输入 $ ./main -p [compile_commands.json 的路径],它会提示缺少位置参数。看来我仍然需要将所有文件名作为参数传递,如果项目真的很大,这是不切实际的。我更喜欢它可以简单地解析 compile_commands.json 中指定的所有文件而不询问,但无法找到如何打开它。

因为我找不到 CommonOptionsParser 的教程要进行任何自定义操作,我使用 CompilationDatabase类代替。有一个虚拟访问者为 VisitStmtVisitDeclVisitType 返回 true,因此我将跳过它。 main 函数非常简单:

int main(int argc, const char **argv) {
string errorMsg = "";
CompilationDatabase *cd = CompilationDatabase::autoDetectFromDirectory (argv[1], errorMsg);
ClangTool Tool(*cd, cd->getAllFiles());

int result = Tool.run(newFrontendActionFactory<ExampleFrontendAction>());

return result;
}

我选择opencv使用 cmake 来解析compile_commands.json的正确性(对吗?)。但是,出现了很多错误(附在最后)。 LibTooling 提示找不到 stdarg.hstddef.hemmintrin.h。这是FAQ对于 clang,但它说明了为什么会发生这种情况,但没有说明如何在使用 libtooling 时解决该问题。将所有参数传递给 clang 的 clang -### 可以解决这个问题,但是如何在使用 libtooling 时传递这些参数呢?

# include <stdarg.h>
^
1 error generated.
Error while processing /home/jcwu/repos/opencv/3rdparty/openexr/IlmImf/ImfCompressionAttribute.cpp.
In file included from /home/jcwu/repos/opencv/3rdparty/libjpeg/jmemansi.c:16:
/home/jcwu/repos/opencv/3rdparty/libjpeg/jinclude.h:35:10: fatal error: 'stddef.h' file not found
#include <stddef.h>
^
1 error generated.
Error while processing /home/jcwu/repos/opencv/3rdparty/libjpeg/jmemansi.c.
error: no suitable precompiled header file found in directory '/home/jcwu/repos/opencv/modules/legacy/precomp.hpp.gch'
1 error generated.
Error while processing /home/jcwu/repos/opencv/modules/legacy/src/hmmobs.cpp.
In file included from /home/jcwu/repos/opencv/3rdparty/libwebp/enc/quant.c:17:
In file included from /home/jcwu/repos/opencv/3rdparty/libwebp/enc/../dsp/../enc/vp8enci.h:17:
/usr/include/string.h:34:10: fatal error: 'stddef.h' file not found
#include <stddef.h>
^
1 error generated.
Error while processing /home/jcwu/repos/opencv/3rdparty/libwebp/enc/quant.c.
In file included from /home/jcwu/repos/opencv/modules/imgproc/opencv_test_imgproc_pch_dephelp.cxx:1:
In file included from /home/jcwu/repos/opencv/modules/imgproc/test/test_precomp.hpp:12:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/iostream:40:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/ostream:40:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/ios:39:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/iosfwd:42:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/postypes.h:42:
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/cwchar:46:
/usr/include/wchar.h:40:11: fatal error: 'stdarg.h' file not found
# include <stdarg.h>

====更新====

阅读CommonOptionsParser.cpp源代码。它使用 FixCompilationDatabase 通过 -- 之后的参数猜测 CompilationDatabase,然后在 -- 之前传递参数以用于自定义(仅 CommonOptionParser 中的 -p)选项。就我而言,compile_commands.json 是必需的,因此我可以跳过使用 CommonOptionsParser。

因此,当我有compile_commands.json时,我的问题减少到如何将这些选项从“clang -###”传递到LibTooling?我应该为我想要解析的每个文件调用 shell 命令吗?

====更新====

我认为修改compile_commands.json可能会更容易。我不确定为什么 CMake 生成的compile_commands.json不会正确包含我的系统头文件文件夹,因为CMakeList.txt生成的Makefile可以正确编译,为什么compile_commands.json会错过很多东西。

最佳答案

我在使用 python 绑定(bind)时遇到了类似的问题。

[<Diagnostic severity 4, location <SourceLocation file '/usr/include/stdio.h', line 33, column 11>, spelling "'stddef.h' file not found">]

在“提示”部分

http://clang.llvm.org/docs/LibTooling.html

他们提到默认包含路径是

$(dirname /path/to/tool)/../lib/clang/3.3/include

这里的想法似乎是,预计您的工具将从 bin 目录执行,该目录也包含 clang 可执行文件本身。通常,这将是一个系统目录,因此从该目录向上将有一个 lib 目录,其中包含 clang/3.4/includ e 目录。所以我手动包含$(which clang)../lib/clang/3.4/include到解析器。在 python 中,这看起来像

translation_unit = index.parse("test.cc",["-I/home/archgoon/usr/local/lib/clang/3.4/include"])

这导致 translation_unit.diagnostics是一个空列表。

关于clang - libtooling 找不到 stddef.h 或其他 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19642590/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com