条件传递链接库

Conditional transitive link libraries

本文关键字:链接 条件      更新时间:2023-10-16

当使用两个依赖于上游包具有可选链接库的包时,我正在努力使用CMake"配置"为基础的包描述。

假设您有libA可选地使用zip功能(例如通过libACMakeLists.txt中的某些选项USE_ZLIB)。这意味着libA在其INTERFACE_LINK_LIBRARIES(导出到liba-config.cmake)中将有-lz。现在,如果你有一个libB使用libA通过find_package(libA),你怎么知道如果libA已经构建与或不支持zlib当两个库安装和导出与CMake的包配置系统?

我知道链接库信息被传递处理,并将传播到libB的链接库,因此每当链接到libB时,-lz就会出现。然而,PATH到libz没有包括在内;因此,除非您神奇地知道libzlibA的一个链接库,并且知道从哪里包含它,否则链接失败并显示"无法找到库z"。在libA的配置中包含libz的绝对路径也是不可取的,因为它会破坏不同系统之间的可移植性。

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

这样做的规范方法是使您的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中的值。