是什么让 clang 在包含路径的子目录中看起来?

What makes clang look in subdirectories of the include path?

本文关键字:子目录 看起来 路径 clang 包含 是什么      更新时间:2023-10-16

运行OS X 10.10.5 当我运行以下命令时:clang -x c -v -E /dev/null我在输出中看到:


clang -cc1 version 7.0.2 based upon LLVM 3.7.0svn default target x86_64-apple-darwin14.5.0
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/Applications/Xcode.app/Contents /Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.0.2/include
/Applications/Xcode.app/Contents /Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
/usr/include
/System/Library/Frameworks (framework directory)
/Library/Frameworks (framework directory)
End of search list.

现在,如果我查看目录/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include

我在那里只看到一个头文件,以及一个名为"c ++"的目录:

ls -l /Applications/Xcode.app/Contents /Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
total 0
-rw-r--r--  1 root  wheel  6235 Nov 11  2015 FlexLexer.h
drwxr-xr-x  3 root  wheel   102 Nov 11  2015 c++

如果查看目录"c ++",那么我会看到目录"v1":

ls -l /Applications/Xcode.app/Contents /Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++
total 0
drwxr-xr-x  102 root  wheel  3468 Nov 11  2015 v1

最后,如果我查看目录"v1",那么我会看到标准的 c++ 库标头,例如:字符串、矢量、映射、iostream 等。

显然,即使 clang 告诉我它会搜索/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/它实际上看起来低两个子目录来查找标准的 c++ 标头。

现在,如果我在/usr/local/include中放入一个标头,编译器会发现该标头没有问题。

但是如果我创建一个子目录/usr/local/include/mysub/并在那里放置一个标头,编译器找不到它。 现在我知道了,我当然可以添加一个-I/usr/local/include/mysub,以便能够找到我放在那里的标题。 但我的问题是:为什么会有这种差异?为什么 clang 在下面的两个子目录中查找 std c++ 标头/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/,但除非我特别告诉它这样做(带有-I标志),否则不会查看下面的/usr/local/include

这只是在 clang 的源代码中硬编码的东西吗? 或者有没有办法将其配置为自动查找包含路径中任何目录的子目录? 谢谢。

编译器驱动程序知道在哪里告诉编译器(或实际上是预处理器)在哪里查找头文件,通常是通过从包含驱动程序可执行文件的目录偏移,这是在驱动程序中硬编码的。通常不希望告诉驱动程序自动查找其他子目录,因为这通常会导致很难跟踪错误。换句话说,您希望使用-I显式指定目录。

如果你正在开发非库应用程序,你永远不应该在/usr/local/include 或类似的目录中放置任何东西。可以说,即使您正在开发库,也不会。