自动合并 target 库
2.5.8 之后,我们可以通过设置 build.merge_archive
策略,启用自动合并依赖的所有静态库,例如:
lua
add_rules("mode.debug", "mode.release")
target("add")
set_kind("static")
add_files("src/add.c")
add_files("src/subdir/add.c")
target("sub")
set_kind("static")
add_files("src/sub.c")
add_files("src/subdir/sub.c")
target("mul")
set_kind("static")
add_deps("add", "sub")
add_files("src/mul.c")
set_policy("build.merge_archive", true)
mul 静态库自动合并了 add 和 sub 静态库,生成一个包含 add/sub 代码的完整 libmul.a 库。
这个合并相对比较稳定完善,支持 ar 和 msvc/lib.exe,也支持交叉编译工具链生成的静态库合并,也支持带有重名 obj 文件的静态库。
合并指定的静态库文件
如果自动合并不满足需求,我们也可以主动调用 utils.archive.merge_archive
模块在 after_link
阶段合并指定的静态库列表。
lua
target("test")
after_link(function (target)
import("utils.archive.merge_staticlib")
merge_staticlib(target, "libout.a", {"libfoo.a", "libbar.a"})
end)
使用 add_files 合并静态库
其实,我们之前的版本已经支持通过 add_files("*.a")
来合并静态库。
lua
target("test")
set_kind("binary")
add_files("*.a")
add_files("*.c")
相关 issues: #1638