使用libclang 6.0.1:未找到stddef.h

时间:2018-09-20 10:33:36

标签: c++ clang libclang

要开始使用libclang,我构建了一个非常简单的程序,尝试加载一个非常简单的源文件。失败,找不到“ stddef.h”文件。

这是使用libclang的程序:

#include <clang-c/Index.h>
int main() {
    CXIndex index = clang_createIndex(1,1);
    const char *source_path = "foo.cpp";
    clang_createTranslationUnitFromSourceFile(index,"foo.cpp",0,0,0,0);
}

(为简洁起见,我省略了与重现该问题无关的代码)。

这是我要加载的文件foo.cpp:

#include <stddef.h>
int main() {}

我正在使用LLVM和Clang 6.0.1,从源代码编译如下:

cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/local -DCMAKE_PREFIX_PATH=$HOME/local -DCMAKE_BUILD_TYPE=Release
make
make install

通过快速搜索可以找到有希望的帖子:Clang Error - stddef file not found?不幸的是,这是关于llvm 3.5的,而我使用的是llvm 6.0.1。另外,我在其中安装LLVM和Clang的目录$ HOME / local没有/ usr / lib目录,因此此处提出的解决方案在这里不起作用。

stddef.h标头位于$HOME/lib/clang/6.0.1/include/stddef.h中。将该路径作为-isystem选项显式添加到clang_createTranslationUnitFromSourceFile调用即可解决此问题。

此外,clang_createTranslationUnitFromSourceFile使用的包含搜索路径与clang ++使用的包含搜索路径不同; clang++ foo.cpp正常运行。

在clang_createTranslationUnitFromSourceFile和libclang中的类似函数使用的包含搜索路径上是否有任何文档,以便我可以确定需要添加哪些包含路径?

关于如何使用正确的包含搜索路径(等同于clang ++所使用的路径)调用clang_createTranslationUnitFromSourceFile的其他建议?

1 个答案:

答案 0 :(得分:1)

libclang的工作就像您尝试编译文件一样,即:要解析文件,它需要知道在哪里查找标头以及可能的其他信息,例如宏定义,编译标志等。< / p>

clang_createTranslationUnitFromSourceFile有两个参数:num_clang_command_line_argsclang_command_line_args。您需要在此处传递实际的标题搜索路径,例如:

const char *cli_args[] = { "-I", "~/local" };
clang_createTranslationUnitFromSourceFile(index, "foo.cpp", 2, cli_args, 0, 0);