C++ 是什么让clang看起来像include路径的子目录?

C++ 是什么让clang看起来像include路径的子目录?,c++,clang,C++,Clang,运行OS X 10.10.5 当我运行以下命令时:clang-xc-v-E/dev/null我在输出中看到: 如果查看目录“c++”,我会看到目录“v1”: 最后,如果我在目录“V1”中查找,那么我会看到标准的C++库标题,如:字符串、向量、映射、IoString等。 显然,即使叮当声告诉我它会搜索到 /Applications/Xcode.app/Contents/Developer/Toolchains/xcodefault.xctoolchain/usr/include/ 实际上,它可以

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


如果查看目录“c++”,我会看到目录“v1”:

最后,如果我在目录“V1”中查找,那么我会看到标准的C++库标题,如:字符串、向量、映射、IoString等。 显然,即使叮当声告诉我它会搜索到
/Applications/Xcode.app/Contents/Developer/Toolchains/xcodefault.xctoolchain/usr/include/
实际上,它可以找到两个子目录来查找标准的C++标题。 现在,如果我在
/usr/local/include
中放入一个头,编译器将发现该头没有问题

但是如果我创建了一个子目录
/usr/local/include/mysub/
,并在那里放了一个头,编译器就找不到它了。现在我知道了,当然我可以添加一个
-I/usr/local/include/mysub
,以便能够找到我放在那里的标题。但我的问题是:为什么会有差异??为什么CLAN看起来下面的代码子> >应用程序/ XCord.App/Cudio/DeaveStudio/XCODEReal.xCoToCult/Ur/Eng/</代码>以找到STD C++头文件,但不会低于下面的代码> /Ur/Prime/Is/<代码>,除非我明确地告诉它这样做(用<代码> -I/COD>标志)??p>
这是不是在clang的源代码中硬编码的东西?或者,有没有一种方法可以将其配置为自动查找包含路径中任何目录的子目录??谢谢。

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


如果您正在开发非库应用程序,则永远不要将任何内容放在/usr/local/include或类似目录中。即使您正在开发库,也可以说不是这样。

谢谢。我也有同样的怀疑,并希望理解硬编码系统或标准库头偏移背后的解释/推理,但强迫用户使用-I作为附加头(出于实际/调试原因)。但是,您能解释一下为什么我不会为我正在/usr/local/include/中开发的库代码放标题吗?我认为这是放置本地开发的头文件的常用位置,许多应用程序可能会使用这些头文件。谢谢。除此之外,类Unix的操作系统本质上是多用户的,因此,如果您将某个内容放在某个系统目录中,没有任何东西可以阻止其他人覆盖它。这些目录是系统头文件所在的位置,而不是您的/usr/local/include用于特定类unix实现的头文件。那么,在哪里放置希望整个系统可用的库和头文件是最好的?防止覆盖不是最好用文件权限来完成的吗?只要你喜欢,你都有正常的写入权限。不,您不能依赖权限,因为作为普通用户,您无论如何都不能写入/usr/local/include,因此您需要root访问权限,其他具有root访问权限的用户可以覆盖您的文件。
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.
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++
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