如何指定OBJECT库的导入依赖项?

tam*_*nez 23 cmake

我有一个链接到主要目标的OBJECT库.该有一个相关库,说.如果我们使用遗留变量,那么很容易:objlibmaintargetobjlibZLIB<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})
Run Code Online (Sandbox Code Playgroud)

但我想将依赖项用作IMPORTED库,因为它更简洁(创建配置模块的便捷方式,即使用install(EXPORT ...),就是这样).

以下代码不起作用,因为target_link_libraries不能与OBJECT库一起使用:

add_library(objlib OBJECT ...)
target_link_libraries(objlib ZLIB::ZLIB)
Run Code Online (Sandbox Code Playgroud)

链接ZLIB::ZLIBmaintarget也不行,objlib没有得到包括目录:

add_library(objlib OBJECT ...)
...
add_executable(maintarget $<TARGET_OBJECTS:objlib>)
target_link_libraries(maintarget ZLIB::ZLIB)
Run Code Online (Sandbox Code Playgroud)

使用中间INTERFACE库(objlib-wrapper)进行黑客攻击也不起作用.

唯一有效的方法是查询IMPORTED库的属性并重新生成<package-name>_*变量中通常可用的信息.这是一个讨厌的解决方法.

有没有更好的办法?

ian*_*n5v 11

从CMake 3.12开始,您现在可以使用target_link_libraries对象库来获取使用要求.

使用3.12,您提到的这种方法应该有效:

add_library(objlib OBJECT ...)
target_link_libraries(objlib ZLIB::ZLIB)
Run Code Online (Sandbox Code Playgroud)

  • 这似乎不适用于其他“target_....”命令,例如“target_include_directories”:-( (2认同)