【发布时间】:2019-02-24 15:29:22
【问题描述】:
为了开始使用 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 使用的 include 搜索路径与 clang++ 使用的不一样; clang++ foo.cpp 可以正常工作。
是否有关于 clang_createTranslationUnitFromSourceFile 使用的包含搜索路径和 libclang 中类似函数的文档,以便我可以确定需要添加哪些包含路径?
关于如何使用正确的包含搜索路径(相当于 clang++ 使用的路径)调用 clang_createTranslationUnitFromSourceFile 的任何其他建议?
【问题讨论】:
-
clang_parseTranslationUnit 的包含路径也有问题。使用 clang 构建是可以的,但与 clang_parseTranslationUnit 相同的 -I 参数不能完全正常工作。我注意到 clang 和 libclang 都在使用 HeaderSearch.cpp。