如果您尝试编译以下Go程序:
package main
import _ "crypto/tls"
func main() {
}
你最终会得到一个动态链接的Go二进制文件。这对我来说很烦人(我在Docker容器中构建一个Go二进制文件,它使用与我的主机不同的libc,这将导致二进制文件无法在我的主机上运行)。
如何强制如何静态构建此类程序?
答案 0 :(得分:8)
crypto/tls
使用cgo的唯一操作系统是darwin,需要调用FetchPEMRoots
来获取根CA.
您的程序使用cgo的原因是因为crypto/tls
导入net
包,默认情况下会链接到主机解析程序。您可以使用" netgo"无需cgo构建net
包。建立标签。
go build -tags netgo
或者,如果你在一个默认情况下没有构建std lib包的版本中,你可以触发它们用新的installsuffix进行编译
go build -installsuffix netgo -tags netgo
由于您不需要或无法在您的环境中使用cgo,因此您可能希望使用CGO_ENABLED=0
构建所有内容以完全禁用cgo。