编程网今天将给大家带来《在 golang 中创建静态二进制文件所需的标志》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!
问题内容我正在使用 scratch
作为基础构建 docker 映像。
以下构建命令:
run go build -o /go/bin/myapp
创建了一个执行时一直失败的二进制文件:
standard_init_linux.go:211: exec user process caused "no such file or directory"
通过反复试验,我发现我需要构建如下:
RUN CGO_ENABLED=0 go build -o /go/bin/myapp -a -ldflags '-extldflags "-static"' .
为什么 cgo_enabled=0
和 -ldflags '-extldflags "-static"'
都是必需的?
这两个选项都不会创建静态二进制文件吗? (即二进制文件在其运行环境中完全不需要任何库?)
解决方案
在我们开始之前,russ cox 的提醒:Comment
也请阅读此内容:Comment
是的,我同意 volker 的评论,即某些系统实际上不允许静态二进制文件。
继续阅读:Compile packages and dependencies
-a
force rebuilding of packages that are already up-to-date.
-ldflags '[pattern=]arg list'
arguments to pass on each go tool link invocation.
阅读:go tool link
-extldflags flags
Set space-separated flags to pass to the external linker.
因此,它尝试在禁用 cgo 的情况下重建所有包(以及依赖项),并且 -static
意味着不链接共享库。
一些与静态链接相关的点解释得很好:Linking golang statically
终于介绍完啦!小伙伴们,这篇关于《在 golang 中创建静态二进制文件所需的标志》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~编程网公众号也会发布Golang相关知识,快来关注吧!