我希望我的项目的某些部分(很少被更改)静态编译并安装"在单独的目录中。这是必要的,因为由于项目的某些细节,它必须经常从头开始重新编译(删除整个构建目录)。 "安装"在单独的目录中静态链接的库将允许显着减少构建时间。
一开始我的所作所为。让我们说LibA很少被改变,我希望它安装一次,而不是在大多数项目构建期间重建。 LibA依赖于某些第三方导入的LibC库。项目还包含LibB,它经常变化并依赖于LibA。
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下进行buildign,则会导致未解决的外部链接错误。
问题:如何使静态导入库LibA依赖于另一个静态导入库LibC?因此,在链接的情况下,链接的LibB指令将包含对LibA和LibC的依赖性。
P.S。我知道这种方式不正确。我用它只是因为我没有找到任何其他方式。如果你帮助我在静态导入库中添加这种依赖关系,或者建议另一种方法如何丰富我在开始时所描述的目标,我将非常感激。
答案 0 :(得分:3)
我正在寻找的功能(在其他导入库中添加静态导入库的依赖性)称为传递链接。它是通过设置目标属性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)
希望这些信息对某人有用。