为了账号安全,请及时绑定邮箱和手机立即绑定

有没有办法将 Go 可执行文件分成几个文件?

有没有办法将 Go 可执行文件分成几个文件?

Go
慕姐4208626 2023-06-01 14:20:23
我正在运送几个用 Go 编译的可执行文件。每个可执行文件本身并不包含很多代码,但它们每个都使用一个公共库,其中包括日志记录、配置管理、通信层等……这导致每个可执行文件的大小在 15-20mb 之间,有时只有 1000 行代码。Go 中是否有一种方法(当前可用或计划在未来发布)允许将应用程序分成几个文件(即 Windows 中的 dll,Linux/Mac 中的 .so)?我知道我可以编译这个库,然后将它用作外部二进制文件,但那样我就无法获得类型系统和 Go 编译器优化的好处。我在这里错了吗,有办法吗?
查看完整描述

2 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

简短的回答:有点?

听起来您要完成的是一个共享库。

Go 编译器从 1.5 开始就可以使用-buildmode=c-shared构建标志生成共享库:

go build -o helloworld.so -buildmode=c-shared

而且,从Go 1.10开始,Windows 还支持该功能

所以,编译成DLL也是一行:

go build -o helloworld.dll -buildmode=c-shared

您将要遇到的问题实际上是使用这些库,尤其是以跨操作系统的方式:

在 *nix 中,您可以使用 CGO 来完成此操作:

package example


// #cgo LDFLAGS: -lfoo

//

// #include <foo.h>

import "C"


func main() {

    C.bar()

}

Windows 拥有自己的Wiki(谁感到惊讶?)。

我会给你一些关于这个的想法:

  1. 15-20mb 的二进制文件没有任何问题(虽然,您应该尝试使用upx来减少一些脂肪,因为为什么不呢?),当您推动 10 到 100 的演出时,您应该担心。现在空间很便宜。

  2. 编写可以编译成单个二进制文件的东西,而不管操作系统如何,是 Go 最好的好处之一。

  3. CGO_ENABLED=0为您的二进制文件节省大量空间。保持启用状态(您需要使用这些功能)对您没有任何好处。

  4. 您正确地认为,由于编译器无法针对包含的库进行优化,因此最终您不会在小型用例中节省太多空间(如果有的话)。

我的最后一点,那我就不再对你说教了:专注于编写代码。二进制大小不应该是你关心的问题,除非你试图适应嵌入式设备。

祝你好运朋友。


查看完整回答
反对 回复 2023-06-01
?
交互式爱情

TA贡献1712条经验 获得超3个赞

您运送的物品彼此密切相关吗?如果是这样,将它们组合成一个可执行文件可能更有意义,该可执行文件在命令行上接受命令来决定开始执行哪个“可执行文件”。

因此,您不必运送“cmd1”、“cmd2”和“cmd3”,而只需运送一个可以通过这种方式调用的程序

$ prog cmd1

$ prog cmd2

$ prog cmd3

您必须做一些额外的工作来解析第一个参数并决定启动哪个子命令。



查看完整回答
反对 回复 2023-06-01
  • 2 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信