首页 > 解决方案 > 如何将 Go 可执行文件与 Windows 上的 Go 编译库静态链接?

问题描述

假设我有一个包main,它导入了另外两个包pkg1pkg2. pkg1并且pkg2不是可执行包,它们是库包。假设pkg1pkg2非常大,在不同的存储库中维护,我想将它们分别编译成两个.a二进制文件。这似乎是可能的

$ go build -i -o ./pkg1/pkg1.a ./pkg1/

当我想编译我的main包时,我想导入这两个.a二进制文件并静态链接它们以获得单个可执行文件。我们如何在Windows上做到这一点?像这样的东西:

$ go build -link ./pkg1/pkg1.a ./pkg2/pkg2.a -o main.exe ./main/main.go

请注意,我不想使用 C API(通过构建 a.dll并将其与 Cgo 一起使用),而是使用 Go API。这意味着我想充分受益于 Go 的功能(类型安全、垃圾收集等)。我也想在Windows上执行此操作,该操作系统目前不支持-buildmode=shared或 Go 插件。我不在乎它是否涉及低级命令和黑魔法。

现在,我知道这不完全是“Go way”。go build自动为我们处理依赖关系并且非常擅长。但是我想知道这是否可能以及如何做到这一点,因为在构建大型二进制文件或出于 IP 原因将已编译的库发送给客户时,这可能是业务需求。

作为第二个问题,如果我想做的事情是可能的,那么生成的可执行文件最终是否会包含相同编译依赖项的多个实例(因此使可执行文件比必要的大)?在这种情况下,有没有办法确保生成的可执行文件将包含每个已编译依赖项的一个实例?

标签: gostatic-librariesstatic-linkinggo-build

解决方案


推荐阅读