C++ 条件传递链接库

C++ 条件传递链接库,c++,cmake,C++,Cmake,当使用两个依赖于上游包的可选链接库的包时,我很难使用基于CMake“Config”的包描述 假设您有libA可以选择使用zip功能(比如在libA的CMakeLists.txt中选择USE_ZLIB)。这意味着libA在其接口链接库中有-lz(导出到libA config.cmake)。 现在,如果您有一个libB使用libA通过find_-package(libA),那么当使用CMake的包配置系统安装和导出这两个库时,您如何知道libA是在zlib支持的情况下构建的 我知道链接库信息是经过传

当使用两个依赖于上游包的可选链接库的包时,我很难使用基于CMake“Config”的包描述

假设您有
libA
可以选择使用zip功能(比如在
libA
CMakeLists.txt
中选择
USE_ZLIB
)。这意味着
libA
在其
接口链接库中有
-lz
(导出到
libA config.cmake
)。 现在,如果您有一个
libB
使用
libA
通过
find_-package(libA)
,那么当使用CMake的包配置系统安装和导出这两个库时,您如何知道
libA
是在zlib支持的情况下构建的

我知道链接库信息是经过传递处理的,并将传播到
libB
的链接库中,因此每当链接到
libB
时,就会出现
-lz
。但是,libz的
路径不包括在内;因此,除非您神奇地知道
libz
libA
的链接库,以及从何处包含它,否则链接将以“找不到库z”的形式失败。 在
libA
的配置中包含到
libz
的绝对路径也是不可取的,因为它破坏了在不同系统上的可移植性


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

实现这一点的标准方法是将
liba config.CMake
作为模板,并使用有关构建选项的信息填充它

例如,您的
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(使用ZLIB 0构建)
set(使用ZLIB 1构建)
取决于它在cmake中的值。

为什么
liba config.cmake
不包含
查找包(ZLIB)
并链接到
${ZLIB库}
?xxx-config.cmake文件是由cmake的install(EXPORT..)命令生成的,这不是您想要模糊的。当然,为了解决这个问题,我脑子里有一大堆肮脏的黑客,但我很感兴趣的是,是否有一种正确的CMake原生方法来处理这个问题。仅供参考:谢谢@ruslo,这是朝着同一个方向发展的!谢谢,但这是一个50/50的帮助。对我来说,这是一个可以想出的“肮脏的黑客”之一。在我的评论中,配置文件是由CMake创建的,我不想弄乱它(它们可能会随着时间的推移而改变/改进,我不想最终更新模板)。但事实是,如果要作为包间通信的手段,那么最终所有关于包的信息都必须包含在配置文件中。