Интерфейсные цели предназначены только для библиотек заголовков. Объявление такой цели не будет производить никакого контента во время компиляции (CMake не будет генерировать правила для создания объектов, исполняемых файлов или библиотеки для этих целей).
Таким образом, CMake необходимо дифференцировать заголовки, которые будут использоваться для компиляции целей, которые производят объекты.
Как я помню, основное использование этих двух свойств заключается в следующем: (пожалуйста, не я не уверен на 100% во всем).
Исполняемая цель
- Может иметь свойство
INCLUDE_DIRECTORIES
со списком каталогов, необходимых для компиляции файлов для этой цели
- Невозможно установить
INTERFACE_INCLUDE_DIRECTORIES
, поскольку другие цели не могут зависеть от выполняемой цели ( Я не уверен в этом )
Цель библиотеки
- Может иметь свойство
INCLUDE_DIRECTORIES
со списком каталогов, необходимых для компиляции файлов для этой цели
- Может иметь набор
INTERFACE_INCLUDE_DIRECTORIES
со списком каталогов, необходимых для компиляции других целей, которые зависят от этой цели
Цель интерфейса
- Невозможно установить свойство
INCLUDE_DIRECTORIES
, поскольку оно никогда не будет скомпилировано
- Скорее всего, установлен
INTERFACE_INCLUDE_DIRECTORIES
, поскольку он содержит только заголовочные файлы, поэтому другие цели, которые зависят от этого, должны будут включать эти заголовки
Поскольку это сложный вопрос, и многие задают его, я превращу этот ответ в ответ сообщества как можно скорее, поэтому, благодаря итеративному уточнению, мы найдем способ правильно объяснить этот момент.