我希望我的项目的一些部分(很少被更改)静态编译并"安装"在单独的目录中.这是必要的,因为由于项目的某些细节,它必须从头开始重新编译(删除整个构建目录).在单独的目录中"安装"静态链接的库将允许显着减少构建时间.
我一开始的所作所为.假设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)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,在链接LibB期间,我们将依赖于LibA 和LibC.每次构建LibB之前,我们都会重建LibA.
为了避免不必要的重建,我制作了新的目标"LibA"(而不是"LibA_build".所以现在LibB依赖于"LibA".
CMakeLists.tst (LibB):
target_link_libraries("LibB" LibA)
Run Code Online (Sandbox Code Playgroud)
这个新目标我声明为导入库.
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)
Run Code Online (Sandbox Code Playgroud)
结果:现在在建立LibB之前,我们没有重建LibA.
问题:因为现在LibA成为导入库,CMake拒绝看到LibA对LibC的依赖.事实上,LibB的链接指令仅包含对LibA的依赖,但不包含对LibC的依赖.如果在Windows下进行buildign,则会导致未解决的外部链接错误.
问题:如何使静态导入库LibA依赖于另一个静态导入库LibC?因此,在链接的情况下,用于链接的LibB指令将包含对LibA和LibC的依赖性.
PS我知道这种方式不正确.我用它只是因为我没有找到任何其他方式.如果你帮助我在静态导入库中添加这种依赖关系或者建议另一种方法如何丰富我在前面描述的目标,我将非常感激.