gpt4 book ai didi

c++ - 条件传递链接库

转载 作者:太空狗 更新时间:2023-10-29 21:40:39 25 4
gpt4 key购买 nike

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

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

我知道链接库信息是传递处理的,会传播到libB的链接库。 ,因此 -lz将在链接到 libB 时出现.然而,PATH to libz 不在任何地方;因此,除非您神奇地知道 libz,否则链接将失败并显示“找不到库 z”是libA的链接库以及从哪里包含它。包括到 libz 的绝对路径在libA的配置也不是要走的路,因为它破坏了不同系统的可移植性。

编辑:我收到建议使用 target_link_libraries(libA PRIVATE z) 的回复,例如声明(实际上是 libA 内部的)libz 是一个私有(private)图书馆。不幸的是,这并不能解决问题,因为 CMake 会自动添加任何 PRIVATE -标记链接库到INTERFACE_LINK_LIBRARIES通过 $<LINK_ONLY:z> 列出.这表明有必要 -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 中的值.

关于c++ - 条件传递链接库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30568733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com