如何静态链接使用crypto/tls的Go二进制文件?

7
如果您尝试编译以下Go程序:
package main

import _ "crypto/tls"

func main() {

}

你最终会得到一个动态链接的Go二进制文件。这对我来说很麻烦(我正在Docker容器中构建Go二进制文件,该容器使用不同于我的主机的libc,这将导致二进制文件无法在我的主机上运行)。
如何强制Go静态构建程序?
1个回答

9

crypto/tls 只在 darwin 系统下使用 cgo,因为它需要调用 FetchPEMRoots 函数来获取根证书。

你的程序使用 cgo 的原因是因为 crypto/tls 导入了 net 包,默认链接到主机解析器。你可以使用 "netgo" 构建标签来构建不带 cgo 的 net 包。

go build -tags netgo

如果你的发行版默认不会编译标准库包,你可以通过新的installsuffix来触发它们被编译。

go build -installsuffix netgo -tags netgo

如果您的环境中不需要使用cgo或无法使用cgo,您可以考虑使用CGO_ENABLED=0来完全禁用cgo,以构建所有内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接