如何将 Go 可执行文件静态链接到 Windows 上的 Go 编译库?

问题描述

假设我有一个包 main,它导入了另外两个包 pkg1pkg2pkg1pkg2 不是可执行包,它们是库包。假设 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(通过构建 .dll 并将其与 Cgo 一起使用),而是使用 Go API。这意味着我想充分利用 Go 的功能(类型安全、垃圾收集等)。我还想在 Windows 上执行此操作,该操作系统目前不受 -buildmode=shared 或 Go 插件支持。我不在乎它是否涉及低级命令和黑魔法。

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

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)