当使用两个依赖包时,我正在努力使用基于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”,除非您神奇地知道PATH
是libz
的链接库以及从哪里包含它。
在libA
的配置中包含libz
的绝对路径也不是可行的方法,因为它会破坏不同系统的可移植性。
编辑:我收到的回复建议使用libA
,例如声明(实际上是libA的内部)libz私有库。不幸的是,这并没有解决问题,因为CMake会自动通过target_link_libraries(libA PRIVATE z)
将任何PRIVATE
标记的链接库添加到INTERFACE_LINK_LIBRARIES
列表中。这表明必须以另一种方式在导出的链接库列表中显示$<LINK_ONLY:z>
(并且CMake导出脚本作者理解传递问题)。
答案 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中的值。