【发布时间】:2020-07-09 14:23:30
【问题描述】:
我们正在编译我们的 Go 代码以在 docker 上运行,并且我们正在调查为什么我们的二进制文件没有执行。我们发现它缺少一些动态库(尽管我们需要静态链接的二进制文件)。
这就是它的编译方式。
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
使用带有CGO_ENABLED=0 的same 构建命令最终解决了问题,并且输出二进制文件是静态链接的。
现在奇怪的是我们有另一个程序使用相同的构建命令,这次使用CGO_ENABLED=1 并且...它是静态链接的!
所以我很困惑为什么在某些情况下CGO_ENABLED=1 会产生动态链接,有时还会产生静态链接。很高兴提供更多详细信息。
【问题讨论】:
-
只有在需要时才动态链接二进制文件。如果你不使用 cgo,那么
CGO_ENABLED=1没有区别。 -
我不确定这里的问题是什么。如果来自
CGO_ENABLED=0的二进制文件是你想要的,你想用原始的go build命令完成什么? (该原始命令看起来像是刚刚粘贴在一起的随机事物的组合) -
@JimB 我试图理解为什么在一种情况下(cgo_enabled=1)二进制文件是动态链接的,而在另一种情况下不是。对于您的问题“我们想要的是 CGO_ENABLED=0 吗?”并不真地。我们想要静态的。 CGO_ENABLED=0 只是神奇地使这种情况发生,我不明白为什么。它更有意义吗?您是否建议完全删除 --installsuffix cgo 和 GO111MODULE 和 CGO?
-
因为一个在使用cgo,一个没有。该命令本身没有意义,您将
-static传递给您未调用的外部链接器(没有-linkmode external),您似乎没有进行交叉编译,但您定义了GOOS ,虽然没有 GOARCH;你有GO111MODULE=on但你没有构建一个包。看起来您添加了一堆选项而不知道它们的作用,这造成了混乱。 -
CGO_ENABLED=0不会“神奇地”实现它,它会阻止使用 cgo,这将导致静态二进制文件,这听起来像你想要的。
标签: go static-linking dynamic-linking