如何使静态导入库依赖于CMake中的另一个静态导入库?
How to make static imported library dependent on another static imported library in CMake?
我希望我的项目中很少更改的某些部分在单独的目录中进行静态编译和 "installed"。这是必要的,因为由于项目的某些细节,它经常必须从头开始重新编译(删除整个构建目录)。 "Installing" 单独目录中的静态链接库将显着减少构建时间。
一开始我有什么。假设 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 的依赖。
P.S。我知道这种方式不是正确的方式。我使用它只是因为我没有找到任何其他方法。如果您能帮我添加对静态导入库的依赖,或者建议另一种方法如何实现我在开始时描述的丰富目标,我将不胜感激。
我一直在寻找的功能(添加静态导入库对其他导入库的依赖)称为传递链接。它是通过设置target属性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)
希望此信息对某人有用。
我希望我的项目中很少更改的某些部分在单独的目录中进行静态编译和 "installed"。这是必要的,因为由于项目的某些细节,它经常必须从头开始重新编译(删除整个构建目录)。 "Installing" 单独目录中的静态链接库将显着减少构建时间。
一开始我有什么。假设 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 的依赖。
P.S。我知道这种方式不是正确的方式。我使用它只是因为我没有找到任何其他方法。如果您能帮我添加对静态导入库的依赖,或者建议另一种方法如何实现我在开始时描述的丰富目标,我将不胜感激。
我一直在寻找的功能(添加静态导入库对其他导入库的依赖)称为传递链接。它是通过设置target属性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)
希望此信息对某人有用。