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