cmake include_directories упорядочить ПОСЛЕ / ДО - PullRequest
2 голосов
/ 28 марта 2012

У меня есть файл в дереве исходников, который называется time.h, точно так же, как системный time.h.Это не может быть изменено.Я столкнулся с проблемой cmake, когда я использую опцию include_library, она переводится в флаг -I, что означает, что мой пользовательский "time.h" превалирует над системным временем.h даже для включений <>.Это определенное нет-нет.

Я пытался использовать include_directories (AFTER dir1 dir2), но он все равно генерирует опцию -I вместо ожидаемой -idirafter.

1 Ответ

3 голосов
/ 28 марта 2012

Я не думаю, что это проблема с CMake; Я считаю, что gcc всегда найдет ваш "time.h" перед системным, независимо от того, используете ли вы кавычки или скобки в #include и независимо от различных опций в include_directories. См. Записи для -I и -isystem в документации gcc

Опция AFTER CMake include_directories относится только к порядку каталогов, указанному в команде gcc, она не относится к флагу -idirafter gcc.

Это не очень хороший план - иметь свои собственные файлы с именами, идентичными системным файлам, но если ваши руки связаны, вы можете избежать этой проблемы, не переименовывая time.h, уточняя путь для ваших собственных включений, поэтому чем, например,

CMakeLists.txt:  include_directories(${PROJECT_SOURCE_DIR}/src)

header file:     #include <time.h>  // we want but don't get system one
                 #include "time.h"  // we want and get own custom one

что-то похожее на

CMakeLists.txt:  include_directories(${PROJECT_SOURCE_DIR})

header file:     #include <time.h>      // we want and get system one
                 #include "src/time.h"  // we want and get own custom one


Альтернативным вариантом будет придерживаться текущей настройки #include (используя угловые скобки для системного time.h и кавычки для себя) и вообще не использовать include_directories в CMakeLists.txt. Вместо этого я думаю, что вы могли бы заменить его на что-то вроде:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -iquote ${PROJECT_SOURCE_DIR}/src")

Использование -iquote, вероятно, является лучшим вариантом, чем -idirafter, поскольку каталог, указанный в -idirafter, (в данном случае неправильно) обрабатывается как системный каталог, и поэтому предупреждения подавляются и т. Д.

Если вы все же выберете этот вариант, вероятно, стоит прокомментировать CMakeLists.txt, чтобы объяснить, почему нет include_directories, чтобы избежать возврата к рефакторингу в будущем для использования более обычной команды include_directories.

В общем, ваш лучший вариант, если это вообще возможно, - переименовать ваш файл "time.h".

...