我们正在编译要在 docker 上运行的 Go 代码,并且正在调查为什么我们的二进制文件没有执行。我们发现它缺少一些动态库(尽管我们想要静态链接的二进制文件)。
这就是它的编译方式。
env GOOS=linux CGO_ENABLED=1 GO111MODULE=on GOPRIVATE=github.com/ourrepo GOPROXY=https://proxy.golang.org go build --installsuffix cgo --ldflags='-extldflags=-static' -o program main.go
使用same构建命令与CGO_ENABLED=0
最终解决了问题,并且输出二进制文件被静态链接。
现在奇怪的是我们有另一个程序正在使用相同的构建命令,这次与CGO_ENABLED=1
而且...它是静态链接的!
所以我很困惑为什么在某些情况下CGO_ENABLED=1
产生动态链接,有时也产生静态链接。很高兴提供更多细节。
一些 Go 包在底层使用 CGO,利用(非常)通用的 C 库来实现跨环境和运行时遇到的边缘情况的更广泛兼容性。
这些通用库可以在大多数主要操作系统发行版上找到 - 但显然不包含在 Scratch 映像中(本质上是完全空的)。
CGO_ENABLED
默认设置为 1,这意味着必须显式禁用它CGO_ENABLED=0
为了避免它,即使使用-static
flag.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)