Python clang 不搜索系统包含路径

csl*_*csl 8 c++ python clang libclang

当从 Python 使用 libclang 时,它似乎不会自动搜索系统的包含路径。

有没有可靠的方法来获取这些路径?我不喜欢硬编码路径,因为我正在编写将在各种 UNIX 系统上运行的代码。

例如,给定 test.cpp

#include <stdio.h>

int main()
{
  puts("Hello, world!");
}
Run Code Online (Sandbox Code Playgroud)

和测试.py

from clang.cindex import Index

tu = Index.create().parse(None, ["test.cpp"])
print(list(tu.diagnostics))
Run Code Online (Sandbox Code Playgroud)

运行python test.py将打印:

[<Diagnostic severity 4, location <SourceLocation file 'test.cpp', line 1, 
 column 10>, spelling "'stdio.h' file not found">]
Run Code Online (Sandbox Code Playgroud)

当然,我可以通过以下方式找到系统包含路径

$ clang -v -E test.cpp
Run Code Online (Sandbox Code Playgroud)

并添加"-Isome/path"parse参数列表中,即

args = ["-I/Applications/[...]", "test.cpp"]
Run Code Online (Sandbox Code Playgroud)

这确实有效并且不会产生任何错误。

然而,这不是可移植的,如果我能够以编程方式让 clang 自动使用它们,那就太好了。

csl*_*csl 5

这个问题已经有一段时间了,所以我会尝试自己回答。

看起来甚至 Clang 本身也大多使用硬编码路径。

它枚举候选路径并添加适合当前上下文的路径。这可以在clang/lib/Frontend/InitHeaderSearch.cpp中看到。例如,

AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2.1",
                           "i686-apple-darwin10", "", "x86_64", triple);
AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.0.0",
                           "i686-apple-darwin8", "", "", triple);

// ...
Run Code Online (Sandbox Code Playgroud)

对于Linux,此代码有以下注意事项:

llvm_unreachable("Include management is handled in the driver.");
Run Code Online (Sandbox Code Playgroud)

在下面,我们可以在、和 等clang/lib/Driver/文件中找到更多此类路径。ToolChains.cppCrossWindowsToolChain.cppMinGWToolChain.cpp

我希望中的代码InitHeaderSearch.cpp能够通过 libclang 暴露给 Python。