Clang 什么';他在用叮当声';s包括优先事项?

Clang 什么';他在用叮当声';s包括优先事项?,clang,include-path,Clang,Include Path,我的命令: /usr/bin/c++ -fPIC -I/Users/me/project/include -I/usr/local/include/opencv \ -I/usr/local/include -I/opt/local/include -std=c++11 -O3 -M -c \ /Users/me/project/src/program.cpp | grep opencv program.cpp具有: #include "opencv2/core/core.hpp" #incl

我的命令:

/usr/bin/c++ -fPIC -I/Users/me/project/include -I/usr/local/include/opencv \
-I/usr/local/include -I/opt/local/include -std=c++11 -O3 -M -c \
/Users/me/project/src/program.cpp | grep opencv
program.cpp
具有:

#include "opencv2/core/core.hpp"
#include "opencv2/ml/ml.hpp"
输出:

  /opt/local/include/opencv2/core/core.hpp \
  /opt/local/include/opencv2/core/types_c.h /usr/include/assert.h \
  /usr/include/math.h /opt/local/include/opencv2/core/version.hpp \
  /opt/local/include/opencv2/core/operations.hpp \
  /opt/local/include/opencv2/core/mat.hpp \
  /opt/local/include/opencv2/objdetect/objdetect.hpp \
  /opt/local/include/opencv2/ml/ml.hpp \
但是,存在:
/usr/local/include/opencv2/core/core.hpp
,以及
/usr/local/include/opencv2/ml/ml.hpp

使用
-v
标志,clang告诉我:

ignoring duplicate directory "/usr/local/include"
  as it is a non-system directory that duplicates a system directory
#include "..." search starts here:
#include <...> search starts here:
 /Users/me/project/include
 /usr/local/include/opencv
 /opt/local/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1
 /usr/local/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.0/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
忽略重复目录“/usr/local/include”
因为它是与系统目录重复的非系统目录
#包括“…”搜索从这里开始:
#包括搜索从这里开始:
/用户/me/project/include
/usr/local/include/opencv
/选择/本地/包括
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/。/lib/c++/v1
/usr/本地/包括
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/./lib/clang/5.0/include
/Applications/Xcode.app/Contents/Developer/toolschains/xcodefault.xctoolschain/usr/include
/usr/包括
/系统/库/框架(框架目录)
/库/框架(框架目录)

尽管命令中的
/usr/local/include
目录列表中
/usr/local/include
排在第一位,为什么clang include from
/opt/local/include
而不是
/usr/local/include
?为什么将
/usr/local/include
按到优先级列表下。

您可以通过以下方式检查
\include
的默认搜索路径:

gcc -Wp,-v -E -
(将
-v
标志赋予预处理器)

您的目录(以
-I
给出)将按照您给出的顺序在标准列表之前进行搜索

您明确地给出
/usr/local/include
,而
gcc
忽略您的指令,因为它稍后将被添加(作为系统目录);因此,目录的搜索顺序是错误的。如果您真的想控制自己搜索的目录,请使用
-nosdinc
并将其全部提供给用户。这是非常脆弱的


拥有两组同名的头文件是一个非常糟糕的主意(正如您所发现的)。没有办法清理那些乱七八糟的东西吗?

试着颠倒包含的顺序,你就会得到你的答案answer@user2485710你是说put
-I/opt/local/include-I/usr/local/include/opencv-I/usr/local/include
?这并不能解决问题
/usr/local/include
仍然在
/opt/local/include
生成的include路径列表中列在
-v
之后。如果它们不包含相同的头,您是否尝试过用最简单的源代码实现这种方式?搜索目录的内容不应影响-v生成的搜索顺序。(而且,它们确实包含相同的标题,尽管这并不重要。)我认为你不理解我的问题。那个测试只是冗长的编译,忘记你对文件的看法,把源代码交给“gcc”,看看真正使用了什么文件。所以,我不应该在/opt/local/lib上安装opencv 2.4.8,开发分支安装在/usr/local/lib?我认为,通过在命令行中指定include和library目录的顺序,可以很容易地在两者之间进行选择。因为gcc和clang的这种行为,这似乎只是一个非常糟糕的想法。“使用两组同名的头文件是一个非常糟糕的想法…”-嗯?这是更新过时库的标准方法。操作系统在
/usr/{include | lib}
中有它们的
旧副本,您将更新后的
副本放在
/usr/local/{include | lib}
中。它是某些库所必需的,比如OpenSSL。苹果仍然提供EOL/OpenSSL 0.9.8。