登录
首页 >  Golang >  Go问答

如何将 Go 可执行文件拆分为多个文件?

来源:stackoverflow

时间:2024-03-01 11:09:24 267浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《如何将 Go 可执行文件拆分为多个文件?》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

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

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

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

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


解决方案


简短的回答:有点?

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

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 
import "c"

func main() {
    c.bar()
}

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

我将就此留下一些想法:

  1. 15-20mb 的二进制文件没有任何问题(不过,您应该尝试 upx 来去掉一些脂肪,因为为什么不呢?),当您推送 10 秒的二进制文件时,您应该担心数百场演出。如今,空间很便宜。
  2. 编写可以编译为单个二进制文件的东西,无论操作系统如何,都是 go 的最佳优势之一。
  3. cgo_enabled=0 可以为您的二进制文件节省大量空间。保持启用状态(您需要使用这些功能)不会给您带来任何好处。
  4. 您的假设是正确的,因为编译器无法针对包含的库进行优化,因此在小型用例中最终您不会节省太多空间(如果有的话)。

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

祝你好运,朋友。

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

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

$ prog cmd1

$ prog cmd2

$ prog cmd3

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

今天关于《如何将 Go 可执行文件拆分为多个文件?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>