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