Как указать импортированные зависимости библиотеки OBJECT?

У меня есть OBJECT библиотека objlib которая связана с главной целевой maintarget. У objlib есть зависимая библиотека, скажем, ZLIB. Если мы используем устаревшие переменные <package-name>_* тогда это просто:

add_library(objlib OBJECT ...)
target_include_directories(objlib ${ZLIB_INCLUDE_DIRS})
...
add_executable(maintarget $<TARGET_OBJECTS:objlib>)
target_link_libraries(maintarget ${ZLIB_LIBRARIES})

Но я хочу использовать зависимость как IMPORTED библиотеку, потому что она более краткая (и удобный способ создания конфигурационных модулей, то есть, используя install(EXPORT...), делает именно это).

Следующий код не работает, потому что target_link_libraries нельзя использовать с библиотекой OBJECT:

add_library(objlib OBJECT ...)
target_link_libraries(objlib ZLIB::ZLIB)

Связывание ZLIB::ZLIB с maintarget также не работает, objlib не получает включаемые каталоги:

add_library(objlib OBJECT ...)
...
add_executable(maintarget $<TARGET_OBJECTS:objlib>)
target_link_libraries(maintarget ZLIB::ZLIB)

Хакерство с промежуточной библиотекой INTERFACE (objlib-wrapper) также не работает.

Единственное, что работает, - это запрос свойств библиотеки IMPORTED и восстановление информации, обычно доступной в переменных <package-name>_*. Какой неприятный обходной путь.

Есть ли способ лучше?

Ответ 1

Начиная с CMake 3.12, теперь вы можете использовать target_link_libraries для библиотек объектов, чтобы получить требования к использованию.

Используя 3.12, этот подход, который вы упомянули, должен работать:

add_library(objlib OBJECT ...)
target_link_libraries(objlib ZLIB::ZLIB)