如何在 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 关于如何开始的提示。
我将 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 关于如何开始的提示。