Что происходит с приоритетами включения clang?

Моя команда:

/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 флаг, лязг говорит мне:

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)

Почему лязг в том числе от /opt/local/include вместо /usr/local/include, несмотря на /usr/local/include первым в списке -I каталоги в команде? Почему /usr/local/include сдвинул вниз список приоритетов.

1 ответ

Вы можете проверить путь поиска по умолчанию для #include от:

gcc -Wp,-v -E -

(дай -v флаг препроцессору).

Ваши каталоги (дано с -I) ищутся перед стандартным списком, в том порядке, в каком вы их даете.

Вы даете /usr/local/include явно, и gcc игнорирует вашу инструкцию, потому что она все равно будет добавлена ​​(как системный каталог) позже; таким образом, каталоги ищутся в неправильном порядке. Если вы действительно хотите контролировать поиск каталогов самостоятельно, используйте -nostdinc и дать им все. Это чрезвычайно хрупко.

Иметь два набора заголовочных файлов с одинаковыми именами - очень плохая идея (как вы узнали). Нет способа убрать этот беспорядок?

Другие вопросы по тегам