Подтвердить что ты не робот

В чем разница между include_directories и target_include_directories в CMake?

У меня есть структура каталогов для моего кода на С++, который выглядит следующим образом:

|
|->include
|->src

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

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

4b9b3361

Ответ 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 будет читать это свойство из всех целевых зависимостей для определить свойства сборки для потребителя.