【问题标题】:What makes clang look in subdirectories of the include path?是什么让 clang 在包含路径的子目录中查找?
【发布时间】:2017-11-27 01:04:18
【问题描述】:

运行 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 会在 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/ 下面的两个子目录中查找 std c++ 头文件,但不会在 /usr/local/include 下面查看,除非我特别告诉它这样做(带有-I 标志)??

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

【问题讨论】:

    标签: c++ clang


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。我也很怀疑,并且很欣赏理解硬编码系统或标准库头偏移背后的解释/推理,但强制用户使用 -I 来获取其他头(出于实际/调试原因)。但是,您能解释一下为什么我 将我正在开发的库代码的标头放在 /usr/local/include/ 中吗?我认为这是放置许多应用程序可能使用的本地开发的标头的常用位置。谢谢。
    • 除此之外,类 Unix 操作系统本质上是多用户的,因此如果您将某些内容放在系统目录之一中,则没有什么可以阻止其他人覆盖它。这些目录是系统头文件所在的位置,而不是你的。 /usr/local/include 旨在用于您的特定类 unix 实现的标头。
    • 那么,在哪里放置想要提供给整个系统的库和头文件的最佳位置是哪里?防止覆盖不是最好通过文件权限来实现吗?
    • 任何你喜欢的地方,你都有正常的写权限。不,您不能依赖权限,因为作为普通用户,您无论如何都不应该写入 /usr/local/include,因此您需要 root 访问权限,而其他任何具有 root 访问权限的人都可以覆盖您的文件。
    猜你喜欢
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2014-07-02
    相关资源
    最近更新 更多