В чем разница между include_directories и target_include_directories в CMake?
У меня есть структура каталогов для моего кода на С++, который выглядит следующим образом:
|
|->include
|->src
Я пишу файл CMakeLists.txt для своего кода. Я хочу понять разницу между include_directories
и target_include_directories
в CMake
.
В чем разница между их использованием и для добавления моего пути к файлу include, который я должен использовать?
Ответы
Ответ 1
include_directories(x/y)
влияет на область каталога. Все цели в этом CMakeList, а также во всех подкаталогах, добавленных после точки его вызова, будут иметь путь x/y
, добавленный в свой путь include.
target_include_directories(t x/y)
имеет целевую область видимости — она добавляет x/y
к пути включения для цели t
.
Вам нужен первый, если все ваши цели используют включенные каталоги. Вы хотите, чтобы последний, если путь специфичен для цели, или если вы хотите более тонкое управление видимостью пути. Последнее связано с тем, что target_include_directories()
поддерживает квалификаторы PRIVATE
, PUBLIC
и INTERFACE
.
Ответ 2
Помимо того, что ответ на английский правильно говорит, еще одно очень важное различие между include_directories
и target_include_directories
заключается в том, что при использовании с PUBLIC
или INTERFACE
последние заполняют свойство INTERFACE_INCLUDE_DIRECTORIES
цели. Это свойство полезно, когда другая цель использует target_link_libraries
для ссылки на исходную цель, поскольку целевая ссылка будет автоматически включаться в каталоги. См. пример.
Эта важная функция довольно хорошо скрыта в документации: target_include_directories упоминает заполнение INTERFACE_INCLUDE_DIRECTORIES
, чей документация говорит:
Когда целевые зависимости задаются с помощью target_link_libraries(), CMake будет читать это свойство из всех целевых зависимостей для определить свойства сборки для потребителя.