静态库在链接到目标时,只有链接到可执行程序或者动态库,才会将此静态库全部打包到目标中。如果是静态库B依赖静态库A,则正常情况下,静态库A并不会被打包到静态库B中。此时,那些依赖静态库B的库在链接静态库B的同时,还需要链接静态库A。如果是动态库B链接到静态库A,则A的所有函数都会打包到动态库B中。此时,依赖动态库B的目标在链接动态库B的时候,就不需要再链接静态库A了。
另外,如果想把静态库A打包到静态库B中,则需要用ar命令:
cmake_minimum_required(VERSION 3.22.0)
project(test LANGUAGES CXX)
add_library(z_b STATIC b.cpp)
find_library(Z_A NAMES libz_a.a PATHS /home/zhjs/Coding/C++/static_lib_test/z_a/build/)
message(STATUS "################ ${Z_A} #################")
target_link_libraries(z_b ${Z_A})
# 首先使用此命令输出一个名为libmerge.a的静态库文件,并执行ar命令,即打包命令。
# 这个ar命令以及参数含义是指将后面两个静态库打包到名为libmerge.a的文件中
add_custom_command(OUTPUT libmerge.a COMMAND ar crsT libmerge.a ${Z_A} $<TARGET_FILE:z_b>)
# 创建一个自定义目标target,叫做z_merge,默认情况下,所有的目标都会被创建,
# 创建此自定义目标的目的是生成目标z_merge之前,由于加了DEPENDS,所以会先生成
# libmerge.a这个目标或者文件,这就保证了一定会执行上述的add_custom_command命令
add_custom_target(z_merge ALL DEPENDS libmerge.a)
这样,就会将两个静态库打包到一个静态库中,这样,其他目标只需要依赖这个libmerge.a即可,不再需要依赖两个单独的静态库。