条件传递链接库

时间:2015-06-01 08:19:40

标签: c++ cmake

当使用两个依赖包时,我正在努力使用基于CMake“Config”的包描述,其中上游包具有可选的链接库。

假设您libA可选择使用zip功能(例如USE_ZLIB的{​​{1}}中的某个选项libA。这意味着CMakeLists.txt可选择在其libA中导出-lz(导出到INTERFACE_LINK_LIBRARIES)。 现在,如果您通过liba-config.cmake使用libB libA,那么在安装和导出两个库时,如何使用或不使用zlib支持构建find_package(libA)? CMake的包配置系统?

我知道链接库信息会被传递处理,并会传播到libA的链接库,因此每当链接到libB时都会显示-lz。但是,libB到libz没有包括在内;因此,链接失败,“找不到库z”,除非您神奇地知道PATHlibz的链接库以及从哪里包含它。 在libA的配置中包含libz的绝对路径也不是可行的方法,因为它会破坏不同系统的可移植性。

编辑:我收到的回复建议使用libA,例如声明(实际上是libA的内部)libz私有库。不幸的是,这并没有解决问题,因为CMake会自动通过target_link_libraries(libA PRIVATE z)将任何PRIVATE标记的链接库添加到INTERFACE_LINK_LIBRARIES列表中。这表明必须以另一种方式在导出的链接库列表中显示$<LINK_ONLY:z>(并且CMake导出脚本作者理解传递问题)。

1 个答案:

答案 0 :(得分:2)

执行此操作的规范方法是使liba-config.cmake成为模板,configure_file()使用有关构建选项的信息填充它。

例如,您的CMakeLists.txt如下所示:

if(ZLIB_FOUND)
... # link with ZLIB
set(BUILT_WITH_ZLIB 1)
endif()
... # more options
configure_file(alib-config.cmake.in alib-config.cmake)

现在,liba-config.cmake.in应该

set(BUILT_WITH_ZLIB @BUILT_WITH_ZLIB@)
if(BUILT_WTH_ZLIB)
# append lz to ALIB_LIBRARIES or whetever you variable is called
endif()

配置后alib-config.cmake将包含set(BUILT_WITH_ZLIB 0)set(BUILT_WITH_ZLIB 1),具体取决于其在CMake中的值。