La compilation croisée Aller sur OSX?
Je suis en train de cross-compiler un aller app sur OSX pour créer des binaires pour windows et linux. J'ai lu tout ce que j'ai pu trouver sur le net. Plus proche de l'exemple que j'ai trouvé a été publié sur (à part de nombreux inachevé discussions sur go-écrous liste de diffusion):
http://solovyov.net/en/2012/03/09/cross-compiling-go/
mais il ne fonctionne pas sur mon installation. Je dois aller 1.0.2. Comme 1.0.2 est assez récent, il me semble que tous les exemples ci-dessus ne s'appliquent pas à cette version.
Essayé de faire ./make.bash --no-clean
avec ENV vars ensemble de 386/windows, il n'construire, cependant il s'appuie aller pour mon installation qui est darwin/amd64
et ignore complètement ce qui est définie dans l'ENV qui suppose de construire différents compilateur.
Tout conseille comment on peut le faire (si on peut le faire à tout)?
- parallèlement à cela, j'ai demandé la même question sur golang-noix de liste de diffusion, et avec le genre de l'aide et de la patience des gens finale recette fait cuire... c'est le sujet de discussion: groups.google.com/forum/?fromgroups=#!topic/golang-noix/... il y a eu plusieurs étapes et conclusions, j'ai eu mal sur le chemin, mais maintenant, la recette semble assez simple en 3 étapes et quelques itérations.
- maintenant que je suis aller sur récapituler, je me promène pourquoi ENV vars ne déclenchent pas de compilation correcte - peut-être parce que je n'ai
sudo
(probablement, je voudrais obtenir différents unix ENV quand sudo-ing donc GOOS & GOARCH ne serait pas disponible si ils ne sont pas fait inline) - re: jdi - j'essayais juste de compiler mon "maquette" go app win/lin binaires sur mac, mais pour faire ça, j'ai dû construire aller lui-même pour chaque combinaison de plate-forme/processeur. (ne peut pas répondre à ma propre question encore - n'ayant pas assez de réputation ici)
- Avez-vous tapez exactement ce qu'il dit dans l'exemple?
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash
- si vous avez essayé de fractionner dans plus d'une ligne, alors la variable d'environnement ne sera pas exporté, ce qui correspond à l'symptômes - Assurez-vous de ne pas confondre l'hôte et la cible de l'architecture. Vous devriez voir cette sortie: "# Construction de compilateurs et d'Aller bootstrap outil pour l'hôte, darwin/amd64." "# Création de packages et les commandes de l'hôte, darwin/amd64." "# Création de packages et des commandes pour windows/386."
- Cela m'a beaucoup aidé: code.google.com/p/go-wiki/wiki/WindowsCrossCompiling
- comme pour: code.google.com/p/go-wiki/wiki/WindowsCrossCompiling m'a beaucoup aidé, mais sur une dernière ligne - comment compiler cible. Le reste est confus pour moi, c'est pour quelqu'un qui sait scripts shell dans les détails et il semble qu'il est construit pour l'installation de linux, peut-être qu'il serait de travailler sur mac, donc je n'ai pas suivi que je voulais apprendre étapes exactes. Je ne suis pas bon avec les scripts shell.
- Re Nick: Oui, au départ j'ai fait
export GOOS=windows
et tous les autres avant de compiler les compilateurs. Je ne savais pas quoi faire je pensais ne faire ne de la croix de la compilation de mon application mais j'ai ensuite appris qu'il compile en fait un compilateur. SUDO ne peut pas hériter d'ENV donc je pense que certains de mes premières tentatives ont échoué en raison de cette UNIX mise en garde. - la page du wiki: oui, il fonctionne très bien sur mac, mais vous avez raison, vous avez besoin d'un peu de script shell connaissances. Après l'exécution des scripts, je peux le faire maintenant: définir les variables d'environnement
GOARCH
etGOOS
et la compilation génère un binaire travail pour la plate-forme/os dans ces variables. - Je suppose que dans de nombreux cas, les x-compilation se passe si vous travaillez sur code sur certains poste de travail qui est déployée à un serveur qui exécute d'autres os. Par exemple, j'ai développer sur Mac et de les déployer sur Linux et mon cycle était de l'écriture de code, compiler pour linux, le transfert de serveur. Dans ce cas, je suppose que l'exportation GOOS/GOARCH serait la meilleure solution. La définition inline est une meilleure option pour moi, car mon but est d'écrire une application qui peut être déployé sur différents Systèmes d'exploitation.
- sudo nettoie l'environnement, ce qui pourrait avoir été la cause de votre problème. Voir l'argument-E pour sudo, si vous avez vraiment besoin de l'utiliser.
- J'ai trouvé cet article à propos de la compilation croisée aller. Le mec qui a écrit il dispose également d'un très pratique util pour elle.
Vous devez vous connecter pour publier un commentaire.
Avec Aller de 1,5 ils semblent avoir amélioré le processus de compilation croisée, c'est à dire construit en maintenant. Pas de
./make.bash
-ing oubrew
-ing nécessaire. Le processus est décrit ici mais pour le TLDR-ers (comme moi) là-bas: il suffit de régler leGOOS
et laGOARCH
variables d'environnement et d'exécuter l'aller construire.Pour la même lazier copier-dérouleurs (comme moi) y, faites quelque chose comme cela si vous êtes sur un *nix système:
Vous même appris l'
env
truc, qui vous permettent de définir des variables d'environnement pour que la commande seulement, tout à fait gratuitement.env FOO=bar cmd
surFOO=bar cmd
?env
commande ne fonctionne que cet appel dans un environnement personnalisé et "réinitialise" il après qu'il est terminé. Par exemple exécuterexport GOOS=windows
, puis la commande avec ou sans leenv
etecho $GOOS
par la suite. Avec leenv
le GOOS n'a pas été modifié.env
. J'ai couruexport GOOS=windows
puisGOOS=linux bash -c 'echo "GOOS: $GOOS"'
puisecho "GOOS: $GOOS"
. Neenv
de fournir une plus grande compatibilité avec d'autres shell dialectes ou avec d'autres plates-formes? Si non, il semble superflu ici.GOOS=windows
sans la commande suivante (accidentellement l'ajout d'un&&
par exemple) fera la même chose queexport GOOS=windows
et définir la variable d'environnement, de sorte que vous devrez être prudent, il ya. Leenv
garanties de quitter l'environnement de tact, et il a plus de fonctions pratiques, par exemple l'ajout de-i
vous donnera un environnement vide, et de l'exécuter sans aucune commande imprimer les variables d'environnement.man env
vous donnera tous les détails.FOO=bar cmd
, donc vous devez utiliserenv FOO=bar cmd
. Donc je pense que le plus grand avantage de l'utilisationenv FOO=bar cmd
est la compatibilité.env GOOS=linux GOARCH=386 go build -v github.com/path/to/your/app
et il fonctionne comme un championGrâce à l'aimable et patient de l'aide de golang-noix, la recette est la suivante:
1) On doit compiler Aller compilateur pour cibles différentes plates-formes et architectures. Cela se fait dans le dossier src à aller de l'installation. Dans mon cas, Aller de l'installation est situé dans
/usr/local/go
donc de compiler un compilateur, vous devez émettremake
utilitaire. Avant de faire cela, vous devez connaître quelques mises en garde.Il y a une question à propos de CGO de la bibliothèque lors de la compilation croisée de sorte qu'il est nécessaire de désactiver CGO bibliothèque.
La compilation se fait en changeant l'emplacement de la source de dir, comme la compilation doit être fait dans ce dossier
ensuite compiler le Aller compilateur:
Vous devez répéter cette étape pour chaque système d'exploitation et l'Architecture que vous souhaitez faire de la compilation croisée en changeant le GOOS et GOARCH paramètres.
Si vous travaillez en mode utilisateur, comme je le fais, sudo est nécessaire parce que Aller compilateur est dans le système dir. Sinon, vous devez être connecté en tant que super-utilisateur. Sur Mac, vous devrez peut-être activer/configurer SU accès (il n'est pas disponible par défaut), mais si vous avez réussi à installer Allez-vous peut-être déjà avoir accès à la racine.
2) une Fois que vous avez tous les compilateurs croisés construit, vous pouvez heureusement cross compiler votre application en utilisant les paramètres suivants par exemple:
Changer le GOOS et GOARCH aux objectifs que vous souhaitez construire.
Si vous rencontrez des problèmes avec CGO inclure CGO_ENABLED=0 dans la ligne de commande. Notez également que les binaires pour linux et mac n'ont pas d'extension de sorte que vous pouvez ajouter une extension pour le plaisir d'avoir des fichiers différents. -o commutateur indique à Aller faire du fichier de sortie comme les anciens compilateurs c/c++ ainsi au-dessus utilisé appname.linux peut être tout autre extension.
# Building compilers and Go bootstrap tool for host, darwin/amd64
mais plus tard, il finit comme:--- Installed Go for windows/386 in /usr/local/go Installed commands in /usr/local/go/bin
donc, on doit observer de fin plutôt qu'au début de la compilation du compilateur.$ GOARCH=386 GOOS=linux go build app.go
et d'avoir d'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
make
va construire une application cible pour moi, pas de ce qui s'est réellementmake
n' - la construction d'un compilateur pour cible de compilation. Ces faits doivent être clairement expliqué.brew reinstall go --cross-compile-all
go install runtime/cgo: open /usr/local/go/pkg/linux_amd64/runtime/cgo.a: permission denied
lorsgo get
ougo install
, quelle est la solution?Si vous utilisez Homebrew sur OS X, alors vous avez une solution plus simple:
ou..
Utilisation
reinstall
si vous avez déjàgo
installé.--cross-compile-all
est maintenant--with-cc-all
Vous pouvez le faire assez facilement à l'aide de menu fixe, donc pas de supplément libs nécessaires. Il suffit d'exécuter cette commande:
Vous pouvez trouver plus de détails dans ce post:
https://medium.com/iron-io-blog/how-to-cross-compile-go-programs-using-docker-beaa102a316d
env GOOS=x GOARCH=y go install something/...
et jusqu'à la fin avec les fichiers binaires appropriés en vertu de$GOPATH/bin/$GOOS_$GOARCH
?? Et BTW, Aller de soutient de plus que les trois Systèmes d'exploitation de votre liste, pourquoi pas d'amour pour le Bsd?J'avais besoin CGO activé lors de la compilation pour windows à partir de mon mac depuis que j'avais importé le https://github.com/mattn/go-sqlite3 et il en avait besoin.
La compilation selon d'autres réponses m'a donné et de l'erreur:
Si vous êtes comme moi et que vous avez à compiler avec CGO. C'est ce que j'ai fait:
1.Nous allons traverser le compiler pour windows avec un CGO dépendant de la bibliothèque. Nous avons d'abord besoin d'un cross compilateur installé comme
mingw-w64
Ce sera probablement installer ici
/usr/local/opt/mingw-w64/bin/
.2.À l'instar d'autres réponses que nous avons d'abord besoin d'ajouter nos fenêtres en arc à notre compilateur toolchain maintenant. La compilation d'un compilateur a besoin d'un compilateur (bizarre phrase) compilation aller compilateur doit disposer d'une pré-construit compilateur. On peut télécharger un préconstruit binaire ou de construire à partir de la source dans un dossier par exemple:
~/Documents/go
maintenant, nous pouvons améliorer notre compilateur, selon les haut de réponse, mais cette fois avec
CGO_ENABLED=1
et la séparation de nos prédéfinis compilateurGOROOT_BOOTSTRAP
(Pooya est mon nom d'utilisateur):3.Maintenant, lors de la compilation de notre code de
mingw
pour compiler notre fichier de ciblage windows avec CGO activé:Le processus de création d'exécutables pour de nombreuses plates-formes peut être un peu fastidieux, c'est pourquoi je suggère d'utiliser un script:
J'ai vérifié ce script sur OSX seulement
gist - go-executable-build.sh