В чем разница между каталогами include и целевыми каталогами include в CMake?
у меня есть структура каталогов для моего кода C++, которая выглядит так:
|
|->include
|->src
Я пишу CMakeLists.txt-файл для моего кода. Я хочу понять разницу между include_directories и target_include_directories на CMake.
в чем разница между их использованием и для того, чтобы добавить свой включать путь к файлу который я должен использовать?
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 будет считывать это свойство из всех целевых зависимостей в определите свойства сборки потребителя.