2 回答
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(谁感到惊讶?)。
我会给你一些关于这个的想法:
15-20mb 的二进制文件没有任何问题(虽然,您应该尝试使用upx来减少一些脂肪,因为为什么不呢?),当您推动 10 到 100 的演出时,您应该担心。现在空间很便宜。
编写可以编译成单个二进制文件的东西,而不管操作系统如何,是 Go 最好的好处之一。
CGO_ENABLED=0
为您的二进制文件节省大量空间。保持启用状态(您需要使用这些功能)对您没有任何好处。您正确地认为,由于编译器无法针对包含的库进行优化,因此最终您不会在小型用例中节省太多空间(如果有的话)。
我的最后一点,那我就不再对你说教了:专注于编写代码。二进制大小不应该是你关心的问题,除非你试图适应嵌入式设备。
祝你好运朋友。
TA贡献1712条经验 获得超3个赞
您运送的物品彼此密切相关吗?如果是这样,将它们组合成一个可执行文件可能更有意义,该可执行文件在命令行上接受命令来决定开始执行哪个“可执行文件”。
因此,您不必运送“cmd1”、“cmd2”和“cmd3”,而只需运送一个可以通过这种方式调用的程序
$ prog cmd1 $ prog cmd2 $ prog cmd3
您必须做一些额外的工作来解析第一个参数并决定启动哪个子命令。
- 2 回答
- 0 关注
- 142 浏览
添加回答
举报