gpt4 book ai didi

c++ - 如何使静态导入库依赖于CMake中的另一个静态导入库?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:05 26 4
gpt4 key购买 nike

我希望我的项目中很少更改的某些部分被静态编译并“安装”在单独的目录中。这是必要的,因为由于项目的某些细节,它经常必须从头开始重新编译(删除整个构建目录)。在单独的目录中“安装”静态链接库将显着减少构建时间。

我一开始有什么。假设 LibA 很少更改,我希望它只安装一次,而不是在大多数项目构建期间重新构建。 LibA 依赖于一些第 3 方导入的库 LibC。项目还包含经常更改并依赖于 LibA 的 LibB。

CMakeLists.tst (LibB):
target_link_libraries("LibB" LibA_build)

CMakeLists.tst (LibA):
add_library(LibA_build ...)
add_library(LibC STATIC IMPORTED)
add_dependencies(LibA_build LibC)

在这种情况下,在链接 LibB 期间,我们将依赖于 LibA 和 LibC。每次构建 LibB 之前,我们都会重建 LibA。

为了避免不必要的重建,我创建了新目标“LibA”(不是“LibA_build”)。所以现在 LibB 依赖于“LibA”。

CMakeLists.tst (LibB):
target_link_libraries("LibB" LibA)

我将这个新目标声明为导入库。

CMakeLists.tst (LibA):
# This target is for building and installing
add_library(LibA_build ...)
SET_TARGET_PROPERTIES(LibA_build PROPERTIES OUTPUT_NAME LibA)
install(
FILES /build/path/to/LibA.lib
DESTINATION /installed/path/to/LibA
)

# This target is for linking LibA with another libraries
add_library(LibA STATIC IMPORTED GLOBAL)
set_property(TARGET LibA PROPERTY IMPORTED_LOCATION /installed/path/to/LibA)

add_library(LibC STATIC IMPORTED)
add_dependencies(LibA LibC)

结果:现在在构建 LibB 之前我们没有重建 LibA。

问题:因为现在 LibA 变成了导入库,CMake 拒绝看到 LibA 对 LibC 的依赖。事实上,LibB 的链接指令仅包含对 LibA 的依赖,但不包含对 LibC 的依赖。如果在 Windows 下构建,它会导致无法解决的外部链接错误。

问题:如何让静态导入库LibA依赖另一个静态导入库LibC?因此,在链接 LibB 的情况下,链接指令将同时包含对 LibA 和 LibC 的依赖。

附言我知道这种方式不是正确的方式。我使用它只是因为我没有找到任何其他方法。如果您能帮助我添加对静态导入库的依赖或建议另一种方法如何实现我在开头描述的丰富目标,我将不胜感激。

最佳答案

我正在寻找的功能(添加静态导入库对其他导入库的依赖)称为传递链接。它是通过设置目标属性 IMPORTED_LINK_INTERFACE_LIBRARIES 来实现的.他们说此属性已被删除并建议使用 INTERFACE_LINK_LIBRARIES,但就我而言(cmake 版本 2.8.11.2)只有 IMPORTED_LINK_INTERFACE_LIBRARIES 有效。

因此,例如,在 LibA 的 CMakeLists.tst 结尾处应该如下所示:

  add_library(LibC STATIC IMPORTED)
a̶d̶d̶_̶d̶e̶p̶e̶n̶d̶e̶n̶c̶i̶e̶s̶(̶L̶i̶b̶A̶ ̶L̶i̶b̶C̶)̶
set_property(TARGET LibC PROPERTY IMPORTED_LOCATION /path/to/LibC)

set_property(TARGET LibA PROPERTY IMPORTED_LINK_INTERFACE_LIBRARIES LibC)

希望这些信息对某人有用。

关于c++ - 如何使静态导入库依赖于CMake中的另一个静态导入库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28080641/

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