猿问

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

我正在运送几个用 Go 编译的可执行文件。每个可执行文件本身并不包含很多代码,但它们每个都使用一个公共库,其中包括日志记录、配置管理、通信层等……

这导致每个可执行文件的大小在 15-20mb 之间,有时只有 1000 行代码。

Go 中是否有一种方法(当前可用或计划在未来发布)允许将应用程序分成几个文件(即 Windows 中的 dll,Linux/Mac 中的 .so)?

我知道我可以编译这个库,然后将它用作外部二进制文件,但那样我就无法获得类型系统和 Go 编译器优化的好处。我在这里错了吗,有办法吗?


慕姐4208626
浏览 143回答 2
2回答

开心每一天1111

简短的回答:有点?听起来您要完成的是一个共享库。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(谁感到惊讶?)。我会给你一些关于这个的想法:15-20mb 的二进制文件没有任何问题(虽然,您应该尝试使用upx来减少一些脂肪,因为为什么不呢?),当您推动 10 到 100 的演出时,您应该担心。现在空间很便宜。编写可以编译成单个二进制文件的东西,而不管操作系统如何,是 Go 最好的好处之一。CGO_ENABLED=0为您的二进制文件节省大量空间。保持启用状态(您需要使用这些功能)对您没有任何好处。您正确地认为,由于编译器无法针对包含的库进行优化,因此最终您不会在小型用例中节省太多空间(如果有的话)。我的最后一点,那我就不再对你说教了:专注于编写代码。二进制大小不应该是你关心的问题,除非你试图适应嵌入式设备。祝你好运朋友。

交互式爱情

您运送的物品彼此密切相关吗?如果是这样,将它们组合成一个可执行文件可能更有意义,该可执行文件在命令行上接受命令来决定开始执行哪个“可执行文件”。因此,您不必运送“cmd1”、“cmd2”和“cmd3”,而只需运送一个可以通过这种方式调用的程序$&nbsp;prog&nbsp;cmd1 $&nbsp;prog&nbsp;cmd2 $&nbsp;prog&nbsp;cmd3您必须做一些额外的工作来解析第一个参数并决定启动哪个子命令。
随时随地看视频慕课网APP

相关分类

Go
我要回答