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

时间:2016-01-17 15:12:13

标签: go static-linking

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

package main

import _ "crypto/tls"

func main() {

}

你最终会得到一个动态链接的Go二进制文件。这对我来说很烦人(我在Docker容器中构建一个Go二进制文件,它使用与我的主机不同的libc,这将导致二进制文件无法在我的主机上运行)。

如何强制如何静态构建此类程序?

1 个答案:

答案 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。