我使用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如何公开这些信息?
答案 0 :(得分:1)
不幸的是,它并不那么容易,因为标头搜索路径的集合取决于很多因素,包括语言,平台,命令行选项,配置时间设置等。此外,通常驱动程序可能会添加额外的路径等。
Frontend库中有HeaderSearch
/ InitHeaderSearch
个类可以完成大部分工作。您可能希望查看clang::ApplyHeaderSearchOptions
- 基本上允许它填充HeaderSearch
实例,您可以迭代各种标题搜索路径。
答案 1 :(得分:1)
如果其他人偶然发现:使用LLVM 3.9.1,仅仅创建编译器实例并从那里读取头搜索信息是不够的。您还必须使用CI.createPreprocessor()
创建预处理器;这是唯一的地方 - 至少在3.9.1 - 调用ApplyHeaderSearchOptions
,如果你想获得默认的标题搜索目录,调用该函数就是你想要的。
之后,您可以使用HeaderSearch
和CI.getPreprocessor().getHeaderSearchInfo()
阅读HeaderSearch.system_dir_begin()
获得的HeaderSearch.system_dir_end()
标题。
感谢@sdgfsdh提供有关如何开始的提示。