golang - Compilación cruzada ¿Vas a OSX?
golang build script (5)
para las personas que necesitan CGO habilitado y compilación cruzada desde las ventanas de segmentación de OSX
Necesitaba CGO habilitado al compilar para Windows desde mi mac ya que había importado el https://github.com/mattn/go-sqlite3 y lo necesitaba. La compilación de acuerdo con otras respuestas me dio un error:
/usr/local/go/src/runtime/cgo/gcc_windows_amd64.c:8:10: fatal error: ''windows.h'' file not found
Si eres como yo y tienes que compilar con CGO. Esto es lo que hice:
1. Vamos a realizar una compilación cruzada para Windows con una biblioteca dependiente de CGO. Primero necesitamos un compilador cruzado instalado como mingw-w64
brew install mingw-w64
Probablemente lo instale aquí /usr/local/opt/mingw-w64/bin/
.
2. Al igual que otras respuestas, primero tenemos que agregar nuestro arco de Windows a nuestra cadena de herramientas de compilación go ahora. La compilación de un compilador necesita un compilador (frase extraña) para compilar el compilador necesita un compilador predefinido por separado. Podemos descargar un binario precompilado o compilar desde el origen en una carpeta, por ejemplo: ~/Documents/go
ahora podemos mejorar nuestro compilador Go, según la respuesta principal, pero esta vez con CGO_ENABLED=1
y nuestro compilador GOROOT_BOOTSTRAP
(Pooya es mi nombre de usuario) )
cd /usr/local/go/src
sudo GOOS=windows GOARCH=amd64 CGO_ENABLED=1 GOROOT_BOOTSTRAP=/Users/Pooya/Documents/go ./make.bash --no-clean
sudo GOOS=windows GOARCH=386 CGO_ENABLED=1 GOROOT_BOOTSTRAP=/Users/Pooya/Documents/go ./make.bash --no-clean
3.Ahora, al compilar nuestro código Go, use mingw
para compilar nuestras ventanas de segmentación de archivos go con CGO habilitado:
GOOS="windows" GOARCH="386" CGO_ENABLED="1" CC="/usr/local/opt/mingw-w64/bin/i686-w64-mingw32-gcc" go build hello.go
GOOS="windows" GOARCH="amd64" CGO_ENABLED="1" CC="/usr/local/opt/mingw-w64/bin/x86_64-w64-mingw32-gcc" go build hello.go
Estoy tratando de compilar de forma cruzada una aplicación go en OSX para crear archivos binarios para Windows y Linux. He leído todo lo que pude encontrar en la red. El ejemplo más cercano que he encontrado ha sido publicado (aparte de muchas discusiones sin terminar en la lista de correo de go-nuts):
http://solovyov.net/en/2012/03/09/cross-compiling-go/
sin embargo, no funciona en mi instalación. Tengo ir 1.0.2. Como 1.0.2 es bastante reciente, me parece que todos los ejemplos anteriores no se aplican a esta versión.
./make.bash --no-clean
hacer ./make.bash --no-clean
con ENV vars establecido en 386 / windows, pero sí ./make.bash --no-clean
, sin embargo, se construye para mi instalación que es darwin/amd64
y se ignora por completo lo que se establece en ENV que supone construir compilador diferente.
¿Algún consejo sobre cómo se puede hacer (si se puede hacer)?
Con Go 1.5, parece que han mejorado el proceso de compilación cruzada, lo que significa que está integrado ahora. No ./make.bash
-ing o brew
-ing requerido. El proceso se describe here pero para los TLDR-ers (como yo): configura las variables de entorno GOOS
y GOARCH
y ejecuta la compilación go.
Para los copiadores aún más perezosos (como yo), haga algo como esto si está en un sistema * nix:
env GOOS=linux GOARCH=arm go build -v github.com/path/to/your/app
Incluso aprendió el truco de env
, que le permite establecer variables de entorno solo para ese comando, completamente gratis.
Gracias a la amable y paciente ayuda de nueces de golang, la receta es la siguiente:
1) Se necesita compilar el compilador Go para diferentes plataformas y arquitecturas de destino. Esto se hace desde la carpeta src en la instalación de go. En mi caso, la instalación se encuentra en /usr/local/go
así para compilar un compilador que necesita para emitir la utilidad make
. Antes de hacer esto, necesitas saber algunas advertencias.
Existe un problema con la biblioteca CGO cuando se compila de forma cruzada, por lo que es necesario para deshabilitar la biblioteca CGO.
La compilación se realiza cambiando la ubicación a un directorio de origen, ya que la compilación debe hacerse en esa carpeta
cd /usr/local/go/src
luego compila el compilador Go:
sudo GOOS=windows GOARCH=386 CGO_ENABLED=0 ./make.bash --no-clean
Debe repetir este paso para cada sistema operativo y arquitectura que desee compilar cruzando cambiando los parámetros GOOS y GOARCH.
Si está trabajando en modo usuario como yo, sudo es necesario porque el compilador go está en el directorio del sistema; de lo contrario, debe iniciar sesión como superusuario. En Mac puede necesitar habilitar / configurar el acceso de SU (por defecto no está disponible), pero si ha logrado instalar ir, posiblemente ya tenga acceso de administrador.
2) Una vez que haya compilado todos los compiladores cruzados, puede realizar una compilación cruzada de su aplicación utilizando la configuración, por ejemplo:
GOOS=windows GOARCH=386 go build -o appname.exe appname.go
GOOS=linux GOARCH=386 CGO_ENABLED=0 go build -o appname.linux appname.go
Cambia GOOS y GOARCH a los objetivos que deseas construir.
Si encuentra un problema con CGO incluya CGO_ENABLED = 0 en la línea de comandos, también tenga en cuenta que los binarios para Linux y Mac no tienen extensión, por lo que puede agregar extensiones por el simple hecho de tener diferentes archivos. -o switch instruye va a hacer que el archivo de salida sea similar a los viejos compiladores para c / c ++, por lo tanto, el appname.linux arriba utilizado puede ser cualquier otra extensión.
Puedes hacerlo fácilmente usando Docker, por lo que no se requieren libs adicionales. Simplemente ejecute este comando:
docker run --rm -it -v "$GOPATH":/go -w /go/src/github.com/iron-io/ironcli golang:1.4.2-cross sh -c ''
for GOOS in darwin linux windows; do
for GOARCH in 386 amd64; do
echo "Building $GOOS-$GOARCH"
export GOOS=$GOOS
export GOARCH=$GOARCH
go build -o bin/ironcli-$GOOS-$GOARCH
done
done
''
Puede encontrar más detalles en esta publicación: https://medium.com/iron-io-blog/how-to-cross-compile-go-programs-using-docker-beaa102a316d
Si usa Homebrew en OS X, entonces tiene una solución más simple:
$ brew install go --with-cc-common # Linux, Darwin, and Windows
o..
$ brew install go --with-cc-all # All the cross-compilers
Use reinstall
si ya tiene instalado.