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

时间:2017-01-04 17:52:31

标签: c++ clang llvm

我使用Clang作为,我想提取用户标准库头的路径。

我可以使用命令行工具提取此信息。例如,在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如何公开这些信息?

2 个答案:

答案 0 :(得分:1)

不幸的是,它并不那么容易,因为标头搜索路径的集合取决于很多因素,包括语言,平台,命令行选项,配置时间设置等。此外,通常驱动程序可能会添加额外的路径等。

Frontend库中有HeaderSearch / InitHeaderSearch个类可以完成大部分工作。您可能希望查看clang::ApplyHeaderSearchOptions - 基本上允许它填充HeaderSearch实例,您可以迭代各种标题搜索路径。

答案 1 :(得分:1)

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

之后,您可以使用HeaderSearchCI.getPreprocessor().getHeaderSearchInfo()阅读HeaderSearch.system_dir_begin()获得的HeaderSearch.system_dir_end()标题。

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