跳转到内容

自动合并 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