C++ 条件传递链接库
当使用两个依赖于上游包的可选链接库的包时,我很难使用基于CMake“Config”的包描述 假设您有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支持的情况下构建的 我知道链接库信息是经过传
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创建的,我不想弄乱它(它们可能会随着时间的推移而改变/改进,我不想最终更新模板)。但事实是,如果要作为包间通信的手段,那么最终所有关于包的信息都必须包含在配置文件中。