Estoy tratando de compilar una aplicación go en OSX para construir 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 en (aparte de muchas discusiones inconclusas sobre la lista de correo para volverse loco):
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.
Intenté hacer ./make.bash --no-clean
con los vars de ENV configurados en 386 / windows, construye ir, sin embargo, construye ir para mi instalación que es darwin/amd64
e ignora completamente lo que está configurado en ENV que supone construir un compilador diferente.
¿Algún consejo sobre cómo se puede hacer (si es que se puede hacer)?
fuente
sudo
(probablemente obtendría un ENV de Unix diferente al sudo, por lo que GOOS & GOARCH no estaría disponible si no se realizaran) en línea)CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash
- si intentó dividirlo en más de una línea, la variable de entorno no se exportará, lo que se ajusta a los síntomasRespuestas:
Con Go 1.5 parecen haber mejorado el proceso de compilación cruzada, lo que significa que ahora está integrado. Sin
./make.bash
-ing obrew
-ing requerido. El proceso se describe aquí, pero para los tldr-res (como yo) por ahí: que acaba de establecer losGOOS
y lasGOARCH
variables de entorno y ejecutar la acumulación marcha.Para los copy-pasters más perezosos (como yo), haga algo como esto si está en un sistema * nix:
Incluso aprendió el
env
truco, que le permite establecer variables de entorno solo para ese comando, completamente gratis.fuente
env
comando ejecuta solo esa llamada en un entorno personalizado y la 'restablece' después de que se realiza. Por ejemploexport GOOS=windows
, ejecutar , luego el comando con o sin elenv
yecho $GOOS
luego. Con elenv
GOOS no se cambió.env
. Corríexport GOOS=windows
a continuación,GOOS=linux bash -c 'echo "GOOS: $GOOS"'
a continuaciónecho "GOOS: $GOOS"
. ¿env
Proporciona una mayor compatibilidad con otros dialectos de shell o con otras plataformas? Si no, parece superfluo aquí.FOO=bar cmd
, por lo que debe usarloenv FOO=bar cmd
. Por lo tanto, creo que la mayor ventaja de usarenv FOO=bar cmd
es la compatibilidad.env GOOS=linux GOARCH=386 go build -v github.com/path/to/your/app
y funciona como un campeónGracias a la amable y paciente ayuda de las 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 de Go se encuentra
/usr/local/go
así, para compilar un compilador, necesita emitir unamake
utilidad. Antes de hacer esto, necesita conocer algunas advertencias.Hay un problema con la biblioteca CGO cuando se realiza una compilación cruzada, por lo que es necesario deshabilitar la biblioteca CGO.
La compilación se realiza cambiando la ubicación al directorio de origen, ya que la compilación debe realizarse en esa carpeta
luego compila el compilador Go:
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 de 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, es posible que deba habilitar / configurar el acceso a SU (no está disponible de forma predeterminada), pero si ha logrado instalar Go, posiblemente ya tenga acceso de root.
2) Una vez que haya compilado todos los compiladores cruzados, puede compilar felizmente su aplicación mediante la siguiente configuración, por ejemplo:
Cambia el GOOS y GOARCH a los objetivos que deseas construir.
Si encuentra problemas con CGO, incluya CGO_ENABLED = 0 en la línea de comando. También tenga en cuenta que los archivos binarios para Linux y Mac no tienen extensión, por lo que puede agregar extensión por el simple hecho de tener diferentes archivos. -o switch indica Ir a hacer que el archivo de salida sea similar a los compiladores antiguos para c / c ++, por lo tanto, el nombre de aplicación utilizado anteriormente.linux puede ser cualquier otra extensión.
fuente
# Building compilers and Go bootstrap tool for host, darwin/amd64
pero luego en realidad termina como:--- Installed Go for windows/386 in /usr/local/go Installed commands in /usr/local/go/bin
así que uno observará el final en lugar del comienzo de la compilación del compilador.$ GOARCH=386 GOOS=linux go build app.go
y obteniendo un error# runtime /usr/local/go/src/pkg/runtime/extern.go:137: undefined: theGoos /usr/local/go/src/pkg/runtime/extern.go:137: cannot use theGoos as type string in const initializer
brew reinstall go --cross-compile-all
Si usa Homebrew en OS X, entonces tiene una solución más simple:
o..
Úselo
reinstall
si ya lo hago
instalado.fuente
--cross-compile-all
es ahora--with-cc-all
Puede hacerlo con bastante facilidad usando Docker, por lo que no se requieren libs adicionales. Solo ejecuta este comando:
Puede encontrar más detalles en esta publicación: https://medium.com/iron-io-blog/how-to-cross-compile-go-programs-using-docker-beaa102a316d
fuente
env GOOS=x GOARCH=y go install something/...
y terminar con los binarios apropiados en$GOPATH/bin/$GOOS_$GOARCH
? Y, por cierto, Go admite más de los tres sistemas operativos que enumeras, ¿por qué no te gustan los BSD?El proceso de creación de ejecutables para muchas plataformas puede ser un poco tedioso, por lo que sugiero usar un script:
Revisé este script solo en OSX
gist - go-executable-build.sh
fuente
Necesitaba CGO habilitado mientras compilaba para Windows desde mi Mac ya que había importado https://github.com/mattn/go-sqlite3 y lo necesitaba. Compilar de acuerdo con otras respuestas me dio un error:
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
Esto probablemente lo instalará aquí
/usr/local/opt/mingw-w64/bin/
.2. Al igual que otras respuestas, primero necesitamos agregar nuestro arco de Windows a nuestra cadena de herramientas del compilador de go ahora. La compilación de un compilador necesita un compilador (oración extraña) que compila el compilador de go necesita un compilador preconstruido por separado. Podemos descargar un binario precompilado o compilar desde la fuente en una carpeta, por ejemplo:
~/Documents/go
ahora podemos mejorar nuestro compilador Go, de acuerdo con la respuesta principal, pero esta vez conCGO_ENABLED=1
nuestro compiladorGOROOT_BOOTSTRAP
precompilado por separado (Pooya es mi nombre de usuario):3.Ahora, mientras compila nuestro código Go, use
mingw
para compilar nuestras ventanas de orientación de archivos Go con CGO habilitado:fuente