В чем разница между каталогами include и целевыми каталогами include в CMake?


у меня есть структура каталогов для моего кода C++, которая выглядит так:

|
|->include
|->src

Я пишу CMakeLists.txt-файл для моего кода. Я хочу понять разницу между include_directories и target_include_directories на CMake.

в чем разница между их использованием и для того, чтобы добавить свой включать путь к файлу который я должен использовать?

2 55

2 ответа:

include_directories(x/y) влияет на объем каталога. Все цели в этом CMakeList, а также во всех подкаталогах, добавленных после точки его вызова, будут иметь путь x/y добавил к их пути.

target_include_directories(t x/y) имеет целевую область-он добавляет x/y на пути к цели t.

вы хотите первый, если все ваши цели используют каталоги include в вопросе. Вы хотите последний, если путь специфичен для цели, или если вы хотите более тонкого контроль видимости пути. Последнее исходит из того, что target_include_directories() поддерживает PRIVATE,PUBLIC и INTERFACE отбор.

рядом Angew это правильно говорит, еще одно очень важное различие между include_directories и target_include_directories Это, что при использовании PUBLIC или INTERFACE, последняя заполняет INTERFACE_INCLUDE_DIRECTORIES свойство цели. Это свойство полезно, когда другой объект применяет target_link_libraries чтобы связать с исходной целью, поскольку цель связывания будет автоматически включать добавленные каталоги. Смотрите пример.

эта важная функция довольно хорошо скрыта в документации: target_include_directories упоминание о заселении INTERFACE_INCLUDE_DIRECTORIES, которого документация говорит:

когда целевые зависимости задаются с помощью target_link_libraries (), CMake будет считывать это свойство из всех целевых зависимостей в определите свойства сборки потребителя.