В чем разница между include_directories и interface_include_directories с библиотекой только заголовков - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь понять разницу между областью, которую можно указать в target_include_directories, в частности PRIVATE и INTERFACE. Документация гласит (конкретный контекст только библиотека заголовков ):

Ключевые слова INTERFACE, PUBLIC и PRIVATE необходимы для указания Объем следующих аргументов. ЧАСТНЫЕ и ОБЩЕСТВЕННЫЕ предметы будут заполнить свойство INCLUDE_DIRECTORIES в. ОБЩЕСТВЕННЫЙ и Элементы INTERFACE будут заполнять INTERFACE_INCLUDE_DIRECTORIES собственностью . (Импортированные цели поддерживают только элементы ИНТЕРФЕЙСА.) Следующие аргументы указывают включаемые каталоги.

Таким образом, в основном использование PRIVATE или INTERFACE изменяет INCLUDE_DIRECTORIES или INTERFACE_INCLUDE_DIRECTORIES. Я изо всех сил пытаюсь понять разницу между ними двумя. Из описания в документе INCLUDE_DIRECTORIES представляется аргумент флага -I при компиляции проекта C ++.

Я совсем не понимаю последнее, может кто-нибудь прояснить?

Также, очевидно, использование INTERFACE лучше при использовании библиотеки только заголовков, почему это так?

1 Ответ

0 голосов
/ 28 августа 2018

Интерфейсные цели предназначены только для библиотек заголовков. Объявление такой цели не будет производить никакого контента во время компиляции (CMake не будет генерировать правила для создания объектов, исполняемых файлов или библиотеки для этих целей).

Таким образом, CMake необходимо дифференцировать заголовки, которые будут использоваться для компиляции целей, которые производят объекты.

Как я помню, основное использование этих двух свойств заключается в следующем: (пожалуйста, не я не уверен на 100% во всем).

Исполняемая цель

  • Может иметь свойство INCLUDE_DIRECTORIES со списком каталогов, необходимых для компиляции файлов для этой цели
  • Невозможно установить INTERFACE_INCLUDE_DIRECTORIES, поскольку другие цели не могут зависеть от выполняемой цели ( Я не уверен в этом )

Цель библиотеки

  • Может иметь свойство INCLUDE_DIRECTORIES со списком каталогов, необходимых для компиляции файлов для этой цели
  • Может иметь набор INTERFACE_INCLUDE_DIRECTORIES со списком каталогов, необходимых для компиляции других целей, которые зависят от этой цели

Цель интерфейса

  • Невозможно установить свойство INCLUDE_DIRECTORIES, поскольку оно никогда не будет скомпилировано
  • Скорее всего, установлен INTERFACE_INCLUDE_DIRECTORIES, поскольку он содержит только заголовочные файлы, поэтому другие цели, которые зависят от этого, должны будут включать эти заголовки

Поскольку это сложный вопрос, и многие задают его, я превращу этот ответ в ответ сообщества как можно скорее, поэтому, благодаря итеративному уточнению, мы найдем способ правильно объяснить этот момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...