如何在 Clang 的标准库中提取 headers 的搜索路径?

How do I extract the search paths for headers in the standard library in Clang?

我将 Clang 用作 ,我想提取用户标准库 headers 所在的路径。

我可以使用 command-line 工具提取此信息。例如,在 OSX 上:

clang -E -v -x c++ /dev/null -fsyntax-only

...
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/bin/../include/c++/v1
 /usr/local/include
 /usr/local/bin/../lib/clang/3.9.0/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.
...

但是,我想以编程方式获取它。类似于:

// (just an example)
std::vector<std::string> searchPaths = clang::GetTypicalHeaderSearchPaths();

Clang 如何公开这些信息?

不幸的是,这并不容易,因为 header 搜索路径的设置取决于很多因素,包括语言、平台、命令行选项、configure-time 设置等。此外,通常driver 可能会添加其他路径等

前端库中有 HeaderSearch / InitHeaderSearch 类 来完成大部分工作。您可能想查看 clang::ApplyHeaderSearchOptions - 基本上允许它填充一个 HeaderSearch 实例,您可以遍历各种 header 搜索路径。

如果其他人遇到这个问题:使用 LLVM 3.9.1,仅仅创建一个编译器实例并从那里读取 header 搜索信息是不够的。您还必须使用 CI.createPreprocessor() 创建预处理器;这是唯一的地方 - 至少在 3.9.1 - 调用 ApplyHeaderSearchOptions 的地方,如果你想获得默认的 header 搜索目录,调用该函数就是你想要的。

之后,您可以使用 HeaderSearch.system_dir_begin()HeaderSearch.system_dir_end()CI.getPreprocessor().getHeaderSearchInfo() 获得 HeaderSearch 的 header。

感谢@sdgfsdh 关于如何开始的提示。