Примерно год назад я спросил о зависимостях заголовка в CMake.
Недавно я понял, что проблема заключается в том, что CMake считает, что эти файлы заголовков являются внешними по отношению к проекту. По крайней мере, при создании проекта Code:: Blocks заголовочные файлы не отображаются в проекте (исходные файлы). Поэтому мне кажется, что CMake считает, что эти заголовки являются внешними по отношению к проекту и не отслеживают их в зависимости.
Быстрый поиск в учебнике CMake указывает только на include_directories
, который, похоже, не делает того, что я хочу...
Каким образом можно сигнализировать CMake, что конкретный каталог содержит заголовки, которые должны быть включены, и чтобы эти заголовки отслеживались сгенерированным Makefile?
Должны быть сделаны две вещи.
Сначала добавьте каталог, который будет включен:
include_directories(${YOUR_DIRECTORY})
Затем вы также должны добавить файлы заголовков в список исходных файлов для текущей цели, например:
set(SOURCES file.cpp file2.cpp ${YOUR_DIRECTORY}/file1.h ${YOUR_DIRECTORY}/file2.h)
add_executable(test ${SOURCES})
Таким образом, файлы заголовков будут отображаться как зависимости в Makefile, а также, например, в сгенерированном проекте visual studio, если вы его создаете.
Изменить: Как использовать эти файлы заголовков для нескольких целей
set(HEADER_FILES ${YOUR_DIRECTORY}/file1.h ${YOUR_DIRECTORY}/file2.h)
add_library(mylib libsrc.cpp ${HEADER_FILES})
add_executable(myexec execfile.cpp ${HEADER_FILES})
Сначала вы используете include_directories()
, чтобы сообщить CMake добавить каталог как -I
в командную строку компиляции. Во-вторых, вы указываете заголовки в своем вызове add_executable()
или add_library()
.
В качестве примера, если ваши источники проекта находятся в src
, и вам нужны заголовки из include
, вы можете сделать это следующим образом:
include_directories(include)
add_executable(MyExec
src/main.c
src/other_source.c
include/header1.h
include/header2.h
)
add_executable
? Я думал, что CMake выяснил зависимости включаемого файла автоматически.
CMake больше похож на язык script, если сравнить его с другими способами создания Makefile (например, make или qmake). Это не очень круто, как python, но все же.
Нет такой вещи, как "правильный путь", если вы смотрите в разных проектах с открытым исходным кодом, как люди включают каталоги. Но есть два способа сделать это.
Crude include_directories будет прикреплять каталог к текущему проекту и всем другим проектам потомков, которые вы добавите через серию add_subdirectory. Иногда люди говорят, что такой подход является наследием.
Более элегантный способ target_include_directories. Это позволяет добавлять каталог для конкретного проекта/цели без (возможно) ненавязчивого наследования или столкновения различных каталогов inlude. Также разрешите выполнить даже сублимированную конфигурацию и добавьте один из следующих маркеров для этой команды.
PRIVATE - используйте только для указанной заданной цели сборки
PUBLIC - используйте его для указанной цели и для целей, которые связаны с этим проектом
ИНТЕРФЕЙС - используйте его только для целей, которые связаны с текущим проектом
p.s.
Обе команды позволяют отмечать каталог как SYSTEM, чтобы дать подсказку, что если это не ваша компания, указанные каталоги будут содержать предупреждения.
Аналогичный ответ с другими парами команд target_compile_definitions/add_definitions, target_compile_options/CMAKE_C_FLAGS