J'essaie de compiler une application go sur OSX pour créer des binaires pour Windows et Linux. J'ai lu tout ce que j'ai pu trouver sur le net. L'exemple le plus proche que j'ai trouvé a été publié sur (à part de nombreuses discussions inachevées sur la liste de diffusion go-nut):
http://solovyov.net/en/2012/03/09/cross-compiling-go/
pourtant cela ne fonctionne pas sur mon installation. J'ai aller 1.0.2. Comme la 1.0.2 est assez récente, il me semble que tous les exemples ci-dessus ne s'appliquent pas à cette version.
J'ai essayé de faire ./make.bash --no-clean
avec ENV vars réglé sur 386 / windows, il construit bien, mais il construit pour mon installation qui est darwin/amd64
et ignore complètement ce qui est défini dans ENV qui suppose de construire un compilateur différent.
Y a-t-il des conseils sur la façon dont cela peut être fait (si cela peut être fait du tout)?
sudo
(j'aurais probablement un autre ENV unix lors du sudo-ing, donc GOOS & GOARCH ne seraient pas disponibles s'ils ne sont pas faits inline)CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash
- si vous avez tenté de le diviser sur plus d'une ligne, la variable d'environnement ne sera pas exportée, ce qui correspond aux symptômesRéponses:
Avec Go 1.5, ils semblent avoir amélioré le processus de compilation croisée, ce qui signifie qu'il est désormais intégré. Aucun
./make.bash
-ing oubrew
-ing requis. Le processus est décrit ici mais pour les tldr-ers (comme moi) là - bas: vous définissez simplement lesGOOS
et lesGOARCH
variables d'environnement et éxecuter la construction vont.Pour les copieurs encore plus paresseux (comme moi), faites quelque chose comme ceci si vous êtes sur un système * nix:
Vous avez même appris l'
env
astuce, qui vous permet de définir des variables d'environnement uniquement pour cette commande, de manière totalement gratuite.la source
env
commande exécute uniquement cet appel dans un environnement personnalisé et le «réinitialise» une fois terminé. Par exemple, exécutezexport GOOS=windows
, puis la commande avec ou sansenv
etecho $GOOS
après. Avec leenv
GOOS n'a pas été changé.env
. J'ai couruexport GOOS=windows
alorsGOOS=linux bash -c 'echo "GOOS: $GOOS"'
alorsecho "GOOS: $GOOS"
. Fournit-ilenv
une plus grande compatibilité avec d'autres dialectes shell ou avec d'autres plates-formes? Sinon, cela semble superflu ici.FOO=bar cmd
, vous devez donc utiliserenv FOO=bar cmd
. Je pense donc que le plus grand avantage à utiliserenv FOO=bar cmd
est la compatibilité.env GOOS=linux GOARCH=386 go build -v github.com/path/to/your/app
et cela fonctionne comme un championGrâce à l'aide aimable et patiente des noix de golang, la recette est la suivante:
1) Il faut compiler le compilateur Go pour différentes plates-formes et architectures cibles. Ceci est fait à partir du dossier src dans l'installation go. Dans mon cas, l'installation de Go se trouve
/usr/local/go
donc pour compiler un compilateur, vous devez émettre unmake
utilitaire. Avant de faire cela, vous devez connaître quelques mises en garde.Il y a un problème concernant la bibliothèque CGO lors de la compilation croisée, il est donc nécessaire de désactiver la bibliothèque CGO.
La compilation se fait en changeant l'emplacement du répertoire source, car la compilation doit être effectuée dans ce dossier
puis compilez le compilateur Go:
Vous devez répéter cette étape pour chaque système d'exploitation et architecture que vous souhaitez effectuer une compilation croisée en modifiant les paramètres GOOS et GOARCH.
Si vous travaillez en mode utilisateur comme je le fais, sudo est nécessaire car le compilateur Go se trouve dans le répertoire système. Sinon, vous devez être connecté en tant que super utilisateur. Sur Mac, vous devrez peut-être activer / configurer l'accès SU (il n'est pas disponible par défaut), mais si vous avez réussi à installer Go, vous avez peut-être déjà un accès root.
2) Une fois que vous avez construit tous les compilateurs croisés, vous pouvez facilement compiler votre application en utilisant les paramètres suivants, par exemple:
Changez le GOOS et le GOARCH en cibles que vous souhaitez construire.
Si vous rencontrez des problèmes avec CGO, incluez CGO_ENABLED = 0 dans la ligne de commande. Notez également que les binaires pour linux et mac n'ont pas d'extension, vous pouvez donc ajouter une extension pour avoir des fichiers différents. -o le commutateur demande à Go de créer un fichier de sortie similaire aux anciens compilateurs pour c / c ++ ainsi utilisé ci-dessus appname.linux peut être n'importe quelle autre extension.
la source
# Building compilers and Go bootstrap tool for host, darwin/amd64
mais plus tard, cela finit en fait comme:--- Installed Go for windows/386 in /usr/local/go Installed commands in /usr/local/go/bin
donc on observera la fin plutôt que le début de la compilation du compilateur.$ GOARCH=386 GOOS=linux go build app.go
et obtenir une erreur# 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 vous utilisez Homebrew sur OS X, vous avez une solution plus simple:
ou..
À utiliser
reinstall
si vous avez déjàgo
installé.la source
--cross-compile-all
est maintenant--with-cc-all
Vous pouvez le faire assez facilement en utilisant Docker, donc aucune bibliothèque supplémentaire n'est requise. Exécutez simplement cette commande:
Vous pouvez trouver plus de détails dans cet article: https://medium.com/iron-io-blog/how-to-cross-compile-go-programs-using-docker-beaa102a316d
la source
env GOOS=x GOARCH=y go install something/...
et se retrouver avec les binaires appropriés sous$GOPATH/bin/$GOOS_$GOARCH
?? Et BTW, Go prend en charge plus que les trois systèmes d'exploitation que vous répertoriez, pourquoi ne pas aimer les BSD?Le processus de création d'exécutables pour de nombreuses plates-formes peut être un peu fastidieux, je suggère donc d'utiliser un script:
J'ai vérifié ce script sur OSX uniquement
gist - go-executable-build.sh
la source
J'avais besoin de CGO activé lors de la compilation pour Windows à partir de mon mac car j'avais importé le https://github.com/mattn/go-sqlite3 et il en avait besoin. Compiler selon d'autres réponses m'a donné et erreur:
Si vous êtes comme moi et que vous devez compiler avec CGO. C'est ce que j'ai fait:
Nous allons effectuer une compilation croisée pour Windows avec une bibliothèque dépendante de CGO. Nous avons d'abord besoin d'un compilateur croisé installé comme
mingw-w64
Cela l'installera probablement ici
/usr/local/opt/mingw-w64/bin/
.Tout comme les autres réponses, nous devons d'abord ajouter notre arcade Windows à notre chaîne d'outils de compilateur go maintenant. La compilation d'un compilateur nécessite un compilateur (phrase étrange). La compilation go compilateur a besoin d'un compilateur pré-construit séparé. Nous pouvons télécharger un binaire prédéfini ou construire à partir des sources dans un dossier, par exemple:
~/Documents/go
maintenant nous pouvons améliorer notre compilateur Go, selon la réponse la plus élevée, mais cette fois avecCGO_ENABLED=1
et notre compilateur prédéfini séparéGOROOT_BOOTSTRAP
(Pooya est mon nom d'utilisateur):3.Maintenant, lors de la compilation de notre code Go, utilisez
mingw
pour compiler nos fenêtres de ciblage de fichiers go avec CGO activé:la source