Около года назад я спросил о зависимостях заголовка в CMake .
Недавно я понял, что проблема заключается в том, что CMake считает эти файлы заголовков внешними по отношению к проекту. По крайней мере, при генерации проекта Code :: Blocks заголовочные файлы не появляются внутри проекта (исходные файлы делают). Поэтому мне кажется, что CMake считает эти заголовки внешними по отношению к проекту и не отслеживает их в зависимости.
Быстрый поиск в учебнике по CMake только указал на то, include_directories
что, кажется, не делает то, что я хочу ...
Как правильно сообщить CMake, что определенный каталог содержит заголовки, которые нужно включить, и что эти заголовки должны отслеживаться сгенерированным Makefile?
.cbp
файл проекта. Теперь, если сканер зависимостей cmake не может правильно определить заголовочный файл как зависимость для Makefile, есть способы исправить это, но в некоторых случаях это может привести к ошибкам, поскольку он не содержит полноценного препроцессора.Ответы:
Две вещи должны быть сделаны.
Сначала добавьте каталог, который будет включен:
В случае, если вы застряли с очень старой версией CMake (2.8.10 или старше) без поддержки
target_include_directories
, вы также можете использовать устаревшую версиюinclude_directories
:Затем вы также должны добавить файлы заголовков в список ваших исходных файлов для текущей цели, например:
Таким образом, файлы заголовков будут отображаться как зависимости в Makefile, а также, например, в сгенерированном проекте Visual Studio, если вы его сгенерируете.
Как использовать эти заголовочные файлы для нескольких целей:
источник
LIBROOT_HEADER_FILES
переменную вliba/CMakefile
иlibb/CMakefile
затем?include_directories
болееtarget_include_directories
. Первый устанавливает его рекурсивно для всех целей в этом каталоге; тогда как последний устанавливает его для цели. Выполнение первого из них нарушает представление о целевом графе в CMake и вместо этого опирается на побочные эффекты в вашей файловой иерархии.target_include_directories
для современного кода CMake. Не стесняйтесь пригласить меня в чат, если вы не согласны с изменениями.Сначала вы используете
include_directories()
CMake, чтобы добавить каталог как-I
в командную строку компиляции. Во-вторых, вы перечисляете заголовки в вашемadd_executable()
илиadd_library()
вызове.Например, если исходные тексты вашего проекта
src
и вам нужны заголовкиinclude
, вы можете сделать это следующим образом:источник
add_executable
? Я думал, что CMake выяснил зависимости включаемого файла автоматически.CMake больше похож на язык сценариев, если сравнивать его с другими способами создания Makefile (например, make или qmake). Это не очень круто, как Python, но все же.
Нет такой вещи, как « правильный путь », если смотреть в различных проектах с открытым исходным кодом, как люди включают каталоги. Но есть два способа сделать это.
Crude include_directories добавит каталог к текущему проекту и всем другим дочерним проектам, которые вы добавите с помощью ряда команд add_subdirectory . Иногда люди говорят, что такой подход является наследием.
Более элегантный способ - с target_include_directories . Это позволяет добавить каталог для конкретного проекта / цели без (может быть) ненужного наследования или столкновения различных включаемых каталогов. Также позвольте выполнить даже тонкую настройку и добавьте один из следующих маркеров для этой команды.
PRIVATE - использовать только для указанной цели сборки
PUBLIC - используйте его для указанной цели и для целей, которые связаны с этим проектом
ИНТЕРФЕЙС - используйте его только для целей, которые связаны с текущим проектом
PS:
Обе команды позволяют пометить каталог как SYSTEM, чтобы дать подсказку, что это не ваша компания, что указанные каталоги будут содержать предупреждения.
Аналогичный ответ с другими парами команд target_compile_definitions / add_definitions , target_compile_options / CMAKE_C_FLAGS
источник
Добавить
include_directories("/your/path/here")
.Это будет похоже на вызов
gcc
с-I/your/path/here/
опцией.Убедитесь, что вы поместили двойные кавычки вокруг пути. Другие люди не упоминали об этом, и это заставило меня застрять на 2 дня. Таким образом, этот ответ для людей, которые очень плохо знакомы с CMake и очень смущены.
источник
У меня такая же проблема.
Моя директория проекта была такой:
И что я использовал для включения файлов во все эти папки:
И это полностью сработало.
источник