CMake: как загрузить интерфейсные классы основного приложения в другую цель cmake?

#c #cmake

#c #cmake

Вопрос:

Как мне загрузить INTERFACE_INCLUDE_DIRECTORIES основного приложения в целевую библиотеку (плагин)? Я знаю, как загрузить INTERFACE_INCLUDE_DIRECTORIES библиотеки, но я не знаю, как загрузить их, не связывая библиотеку.

 ├── app
├── pluga
└── plugb
  

Комментарии:

1. Связывание — единственный способ автоматического распространения свойств от одной цели к другой. Вы можете создать библиотеку только для заголовков ( add_library(... INTERFACE) ), установить ее свойство INTERFACE_INCLUDE_DIRECTORIES и связать с ней как приложение, так и плагины.

Ответ №1:

target_include_directories() Команда INTERFACE_INCLUDE_DIRECTORIES заполняется значениями, заданными PUBLIC INTERFACE ключевым словам and .

Цели могут заполнить это свойство, чтобы опубликовать включаемые каталоги, необходимые для компиляции с заголовками для цели. Целевые объекты-потребители могут добавлять записи в свое собственное INCLUDE_DIRECTORIES свойство, например, $<TARGET_PROPERTY:foo,INTERFACE_INCLUDE_DIRECTORIES> для использования каталогов include, указанных в интерфейсе foo .

Итак, ответ заключается в использовании:

 target_include_directories(pluga INTERFACE
    $<TARGET_PROPERTY:app,INTERFACE_INCLUDE_DIRECTORIES>
)
  

Из документации.