2016-01-17 18 views
6

Se si tenta di compilare il seguente programma Go:Come collegare staticamente un binario Go che utilizza crypto/tls?

package main 

import _ "crypto/tls" 

func main() { 

} 

finirai con un Go binario collegata in modo dinamico. Questo è fastidioso per me (sto costruendo un binario Go all'interno di un contenitore Docker, che usa una libc diversa dal mio host, il che farà sì che il file binario non funzioni sul mio host).

Come funziona uno forza Vai a creare un programma in modo statico?

risposta

8

L'unico sistema operativo in cui crypto/tls utilizza cgo è darwin, dove è necessario chiamare FetchPEMRoots per ottenere le CA radice.

Il motivo per cui il tuo programma utilizza cgo è perché crypto/tls importa il pacchetto net, che si collega al resolver host per impostazione predefinita. È possibile creare il pacchetto net senza cgo utilizzando il tag di build "netgo".

go build -tags netgo 

Oppure, se sei in un comunicato in cui i pacchetti std lib non saranno costruite per impostazione predefinita, è possibile attivare per essere compilato con un nuovo installsuffix

go build -installsuffix netgo -tags netgo 

Visto che siete Non avrò la necessità o la capacità di usare cgo nel tuo ambiente, potresti semplicemente creare tutto con CGO_ENABLED=0 per disabilitare completamente cgo.