我有一个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>_*
变量中通常可用的信息。这是一个讨厌的解决方法。
有更好的方法吗?
答案 0 :(得分:10)
从CMake 3.12开始,您现在可以在对象库上使用target_link_libraries
来获得使用要求。
使用3.12,您提到的这种方法应该有效:
add_library(objlib OBJECT ...)
target_link_libraries(objlib ZLIB::ZLIB)