Ich versuche, eine Go-App unter OSX zu kompilieren, um Binärdateien für Windows und Linux zu erstellen. Ich habe alles gelesen, was ich im Internet finden konnte. Das nächste Beispiel, das ich gefunden habe, wurde veröffentlicht (abgesehen von vielen unvollendeten Diskussionen auf der Go-Nuts-Mailingliste):
http://solovyov.net/de/2012/03/09/cross-compiling-go/
Bei meiner Installation funktioniert es jedoch nicht. Ich bin 1.0.2 gegangen. Da 1.0.2 ziemlich neu ist, scheint es mir, dass alle obigen Beispiele nicht für diese Version gelten.
Es wurde versucht, ./make.bash --no-clean
mit ENV-Variablen zu tun, die auf 386 / Windows eingestellt sind, aber es wird für meine Installation erstellt, wobei die darwin/amd64
in ENV festgelegten Einstellungen, die davon ausgehen, dass ein anderer Compiler erstellt wird, vollständig ignoriert werden.
Irgendwelche Ratschläge, wie es gemacht werden kann (wenn es überhaupt gemacht werden kann)?
quelle
sudo
durcharbeite, frage ich mich, warum ENV-Vars keine korrekte Kompilierung ausgelöst haben - vielleicht weil ich es getan habe (wahrscheinlich würde ich beim Sudoing ein anderes Unix-ENV erhalten, sodass GOOS & GOARCH nicht verfügbar wären, wenn sie nicht ausgeführt würden inline)CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash
- Wenn Sie versucht haben, es auf mehr als eine Zeile aufzuteilen, wird die Umgebungsvariable nicht exportiert, was den Symptomen entsprichtAntworten:
Mit Go 1.5 scheinen sie den Cross-Compilation-Prozess verbessert zu haben, was bedeutet, dass er jetzt eingebaut ist. Kein
./make.bash
-ing oderbrew
-ing erforderlich. Der Prozess wird hier beschrieben , aber für die TLDR-Benutzer (wie mich) da draußen: Sie setzen einfach dieGOOS
und dieGOARCH
Umgebungsvariablen und führen den go-Build aus.Machen Sie für die noch fauleren Copy-Paster (wie mich) da draußen so etwas, wenn Sie auf einem * nix-System sind:
Sie haben sogar den
env
Trick gelernt , mit dem Sie Umgebungsvariablen nur für diesen Befehl völlig kostenlos festlegen können.quelle
env
Befehl führt nur diesen Aufruf in einer benutzerdefinierten Umgebung aus und setzt ihn zurück, nachdem er ausgeführt wurde. Zum Beispiel ausführenexport GOOS=windows
, dann den Befehl mit oder ohneenv
undecho $GOOS
danach. Mit dem wurdeenv
die GOOS nicht verändert.env
. Ich binexport GOOS=windows
dannGOOS=linux bash -c 'echo "GOOS: $GOOS"'
dann gelaufenecho "GOOS: $GOOS"
. Bietetenv
eine bessere Kompatibilität mit anderen Shell-Dialekten oder mit anderen Plattformen? Wenn nicht, erscheint es hier überflüssig.FOO=bar cmd
, müssen Sie sie verwendenenv FOO=bar cmd
. Daher denke ich, dass der größte Vorteil dieenv FOO=bar cmd
Kompatibilität ist.env GOOS=linux GOARCH=386 go build -v github.com/path/to/your/app
und sie funktioniert wie ein ChampionDank der freundlichen und geduldigen Hilfe von Golang-Nüssen lautet das Rezept wie folgt:
1) Man muss den Go-Compiler für verschiedene Zielplattformen und -architekturen kompilieren. Dies erfolgt aus dem src-Ordner in der go-Installation. In meinem Fall befindet sich die Go-Installation in. Um
/usr/local/go
einen Compiler zu kompilieren, müssen Sie dasmake
Dienstprogramm ausgeben . Bevor Sie dies tun, müssen Sie einige Einschränkungen kennen.Beim Cross-Compilieren tritt ein Problem mit der CGO-Bibliothek auf, sodass die CGO-Bibliothek deaktiviert werden muss.
Das Kompilieren erfolgt durch Ändern des Speicherorts in das Quellverzeichnis, da das Kompilieren in diesem Ordner erfolgen muss
Kompilieren Sie dann den Go-Compiler:
Sie müssen diesen Schritt für jedes Betriebssystem und jede Architektur wiederholen, die Sie kompilieren möchten, indem Sie die Parameter GOOS und GOARCH ändern.
Wenn Sie wie ich im Benutzermodus arbeiten, wird sudo benötigt, da sich der Go-Compiler im Systemverzeichnis befindet. Andernfalls müssen Sie als Superuser angemeldet sein. Auf einem Mac müssen Sie möglicherweise den SU-Zugriff aktivieren / konfigurieren (er ist standardmäßig nicht verfügbar). Wenn Sie jedoch die Installation von Go geschafft haben, haben Sie möglicherweise bereits Root-Zugriff.
2) Sobald Sie alle Cross-Compiler erstellt haben, können Sie Ihre Anwendung problemlos Cross-Compilieren, indem Sie beispielsweise die folgenden Einstellungen verwenden:
Ändern Sie die GOOS und GOARCH in Ziele, die Sie erstellen möchten.
Wenn Sie Probleme mit CGO haben, geben Sie CGO_ENABLED = 0 in die Befehlszeile ein. Beachten Sie auch, dass Binärdateien für Linux und Mac keine Erweiterung haben, sodass Sie eine Erweiterung hinzufügen können, um unterschiedliche Dateien zu haben. -o Schalteranweisungen Gehen Sie, um die Ausgabedatei ähnlich wie bei alten Compilern für c / c ++ zu machen. Daher kann der oben verwendete appname.linux eine beliebige andere Erweiterung sein.
quelle
# Building compilers and Go bootstrap tool for host, darwin/amd64
aber später endet es tatsächlich als:--- Installed Go for windows/386 in /usr/local/go Installed commands in /usr/local/go/bin
man soll also eher das Ende als den Beginn des Kompilierens des Compilers beobachten.$ GOARCH=386 GOOS=linux go build app.go
und Fehler zu bekommen# 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
Wenn Sie Homebrew unter OS X verwenden, haben Sie eine einfachere Lösung:
oder..
Verwenden
reinstall
Sie diese Option, wenn Sie bereitsgo
installiert haben.quelle
--cross-compile-all
ist jetzt--with-cc-all
Sie können dies ziemlich einfach mit Docker tun, sodass keine zusätzlichen Bibliotheken erforderlich sind. Führen Sie einfach diesen Befehl aus:
Weitere Details finden Sie in diesem Beitrag: https://medium.com/iron-io-blog/how-to-cross-compile-go-programs-using-docker-beaa102a316d
quelle
env GOOS=x GOARCH=y go install something/...
und die entsprechenden Binärdateien unter erhalten könnte$GOPATH/bin/$GOOS_$GOARCH
? Übrigens unterstützt Go mehr als die drei von Ihnen aufgelisteten Betriebssysteme. Warum keine Liebe zu den BSDs?Das Erstellen von ausführbaren Dateien für viele Plattformen kann etwas langwierig sein. Ich empfehle daher, ein Skript zu verwenden:
Ich habe dieses Skript nur unter OSX überprüft
Kern - go-executable-build.sh
quelle
Ich musste CGO beim Kompilieren für Windows von meinem Mac aktivieren, da ich https://github.com/mattn/go-sqlite3 importiert hatte und es brauchte. Das Kompilieren nach anderen Antworten gab mir und Fehler:
Wenn du wie ich bist und mit CGO kompilieren musst. Das habe ich getan:
1.Wir werden für Windows mit einer CGO-abhängigen Bibliothek eine Cross-Kompilierung durchführen. Zuerst brauchen wir einen Cross-Compiler wie installiert
mingw-w64
Dies wird es wahrscheinlich hier installieren
/usr/local/opt/mingw-w64/bin/
.2. Genau wie bei anderen Antworten müssen wir jetzt zuerst unseren Windows-Bogen zu unserer Go-Compiler-Toolchain hinzufügen. Das Kompilieren eines Compilers benötigt einen Compiler (seltsamer Satz). Das Kompilieren des go-Compilers benötigt einen separaten vorgefertigten Compiler. Wir können eine vorgefertigte Binärdatei herunterladen oder aus dem Quellcode in einem Ordner erstellen, z. B.:
~/Documents/go
Jetzt können wir unseren Go-Compiler gemäß der Top-Antwort verbessern, diesmal jedoch mitCGO_ENABLED=1
und unserem separaten vorgefertigten CompilerGOROOT_BOOTSTRAP
(Pooya ist mein Benutzername):3. Verwenden Sie jetzt beim Kompilieren unseres Go-Codes
mingw
das Kompilieren unserer Go-Datei-Targeting-Fenster mit aktiviertem CGO:quelle