2016-01-17 6 views
6

Wenn Sie versuchen, das folgende Go-Programm zu kompilieren:Wie kann man eine Go-Binärdatei statisch verknüpfen, die crypto/tls verwendet?

package main 

import _ "crypto/tls" 

func main() { 

} 

Sie werden mit einem dynamisch verknüpften Go binären aufzuwickeln. Das nervt mich (ich baue eine Go-Binärdatei in einem Docker-Container, der eine andere libc von meinem Host verwendet, was dazu führt, dass die Binärdatei nicht auf meinem Host läuft).

Wie funktioniert ein zwingen Gehen Sie ein solches Programm statisch zu bauen?

Antwort

8

Das einzige Betriebssystem, wo crypto/tls cgo verwendet, ist Darwin, wo es FetchPEMRoots aufrufen muss, um die Stammzertifizierungsstellen zu erhalten.

Der Grund, dass Ihr Programm cgo verwendet, ist, weil crypto/tls das net-Paket importiert, das standardmäßig mit dem Host-Resolver verknüpft ist. Sie können das Paket net ohne cgo mit dem Build-Tag "netgo" erstellen.

go build -tags netgo 

Oder wenn Sie auf einem Release sind, wo die std lib Pakete werden nicht standardmäßig erstellt werden, können Sie sie auslösen mit einem neuen installsuffix zu erstellenden

go build -installsuffix netgo -tags netgo 

Da du bist Wenn Sie nicht die Notwendigkeit oder Fähigkeit haben, cgo in Ihrer Umgebung zu verwenden, können Sie einfach alles mit CGO_ENABLED=0 erstellen, um cgo vollständig zu deaktivieren.

Verwandte Themen