Я не думаю, что это проблема с 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".