Как правильно добавить каталоги include с помощью CMake
около года назад я спросил о зависимостях заголовков в CMake.
недавно я понял, что проблема, похоже, заключалась в том, что CMake считал эти заголовочные файлы внешний в проект. По крайней мере, при создании проекта Code::Blocks заголовочные файлы не отображаются в проекте (исходные файлы). Поэтому мне кажется, что CMake считает эти заголовки внешний к проекту, и не отслеживает их в зависит.
быстрый поиск в учебнике CMake только указал на include_directories который, кажется, не делает то, что я хочу...
Как правильно сигнализировать CMake, что определенный каталог содержит заголовки, которые должны быть включены, и что эти заголовки должны отслеживаться сгенерированным файлом Makefile?
4 ответов:
две вещи должны быть сделаны.
Сначала добавьте каталог, который будет включен:
target_include_directories(test PRIVATE ${YOUR_DIRECTORY})в случае, если вы застряли с очень старой версией CMake (2.8.10 или старше) без поддержки
target_include_directories, вы также можете использовать наследиеinclude_directoriesвместо: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}) target_include_directories(mylib PRIVATE ${YOUR_DIRECTORY}) add_executable(myexec execfile.cpp ${HEADER_FILES}) target_include_directories(myexec PRIVATE ${YOUR_DIRECTORY})
во-первых, вы используете
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 )
CMake больше похож на язык скриптов, если сравнивать его с другими способами создания Makefile (например, make или qmake). Это не очень круто, как питон, но все же.
нет такой вещи, как "правильно " если смотреть в различных проектах с открытым исходным кодом, как люди включают каталоги. Но есть два способа сделать это.
нефть include_directories добавит каталог к текущему проекту и всем остальным потомкам проекты, которые вы будете добавлять через ряд add_subdirectory команды. Иногда люди говорят, что такой подход является наследием.
более элегантный способ-с target_include_directories. Это позволяет добавлять каталог для конкретного проекта / цели без (возможно) ненужного наследования или столкновения различных каталогов include. Также позволяют выполнить даже тонкую конфигурацию и добавить для этого один из следующих маркеров команда.
частная - использовать только для указанной цели
общественные - используйте его для указанной цели и для целей, которые связаны с этим проектом
интерфейс -- используйте его только для целей, которые связаны с текущим проектом
PS:
обе команды позволяют отметить каталог как систему, чтобы дать подсказку, что это не ваше дело, что указанные каталоги будут содержать предупреждения.
аналогичный ответ с другими парами команд target_compile_definitions/ add_definitions, target_compile_options/ CMAKE_C_FLAGS
у меня была та же проблема.
мой каталог проекта был такой:
--project ---Classes ----Application -----.h and .c files ----OtherFolders --main.cppи то, что я использовал, чтобы включить все файлы в этих папках:
file(GLOB source_files "*.h" "*.cpp" "Classes/*/*.cpp" "Classes/*/*.h" ) add_executable(Server ${source_files})и это сработало.
Comments