Próbuję skompilować krzyżowo aplikację go na OSX, aby zbudować pliki binarne dla systemu Windows i Linux. Przeczytałem wszystko, co mogłem znaleźć w sieci. Najbliższy przykład, jaki znalazłem, został opublikowany (poza wieloma niedokończonymi dyskusjami na liście mailingowej go-nuts):
http://solovyov.net/en/2012/03/09/cross-compiling-go/
jednak nie działa na mojej instalacji. Mam przejść 1.0.2. Ponieważ wersja 1.0.2 jest całkiem nowa, wydaje mi się, że wszystkie powyższe przykłady nie mają zastosowania do tej wersji.
Próbowałem zrobić ./make.bash --no-clean
ze zmiennymi ENV ustawionymi na 386 / windows, kompiluje się, jednak kompiluje się dla mojej instalacji, która jest darwin/amd64
i całkowicie ignoruje to, co jest ustawione w ENV, które zakłada budowanie innego kompilatora.
Jakieś rady, jak to zrobić (jeśli w ogóle można to zrobić)?
źródło
sudo
(prawdopodobnie dostałbym inny unix ENV podczas sudo, więc GOOS i GOARCH nie byłyby dostępne, gdyby nie zostały wykonane inline)CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash
- jeśli próbowałeś podzielić go na więcej niż jedną linię, zmienna środowiskowa nie zostanie wyeksportowana, która pasuje do objawówOdpowiedzi:
Wydaje się, że dzięki Go 1.5 poprawili proces kompilacji krzyżowej, co oznacza, że jest teraz wbudowany. Nie jest wymagane
./make.bash
anibrew
-ing ani -ing. Proces ten opisany jest tutaj ale dla TLDR-ers (jak ja) tam: wystarczy ustawićGOOS
iGOARCH
zmienne środowiskowe i uruchomić odchodzenie budować.Dla jeszcze bardziej leniwych kopiarek (takich jak ja) zrób coś takiego, jeśli korzystasz z systemu * nix:
Nauczyłeś się nawet
env
sztuczki, która pozwala ustawić zmienne środowiskowe tylko dla tego polecenia, całkowicie bezpłatnie.źródło
env
biegnie tylko że polecenie wywołania w środowisku niestandardowym i resetuje „” to po to jest zrobione. Na przykład runexport GOOS=windows
, a następnie polecenie z lub bez,env
aecho $GOOS
następnie. Zenv
GOOS nie został zmieniony.env
. Pobiegłemexport GOOS=windows
po czymGOOS=linux bash -c 'echo "GOOS: $GOOS"'
następnieecho "GOOS: $GOOS"
. Czyenv
zapewnia większą kompatybilność z innymi dialektami powłoki lub z innymi platformami? Jeśli nie, wydaje się to tutaj zbyteczne.FOO=bar cmd
, więc musisz użyćenv FOO=bar cmd
. Dlatego myślę, że największą zaletąenv FOO=bar cmd
jest kompatybilność.env GOOS=linux GOARCH=386 go build -v github.com/path/to/your/app
i działa jak mistrzDzięki życzliwej i cierpliwej pomocy golang-orzeszków receptura jest następująca:
1) Należy skompilować kompilator Go dla różnych platform docelowych i architektur. Odbywa się to z folderu src podczas instalacji go. W moim przypadku instalacja Go znajduje się w,
/usr/local/go
więc aby skompilować kompilator, musisz wydaćmake
narzędzie. Zanim to zrobisz, musisz poznać kilka zastrzeżeń.Występuje problem dotyczący biblioteki CGO podczas kompilacji krzyżowej, dlatego konieczne jest wyłączenie biblioteki CGO.
Kompilacja odbywa się poprzez zmianę lokalizacji na katalog źródłowy, ponieważ kompilacja musi być wykonana w tym folderze
następnie skompiluj kompilator Go:
Musisz powtórzyć ten krok dla każdego systemu operacyjnego i architektury, które chcesz skompilować krzyżowo, zmieniając parametry GOOS i GOARCH.
Jeśli pracujesz w trybie użytkownika tak jak ja, sudo jest potrzebne, ponieważ kompilator Go znajduje się w katalogu systemowym. W przeciwnym razie musisz być zalogowany jako superużytkownik. Na Macu może być konieczne włączenie / skonfigurowanie dostępu SU (domyślnie nie jest dostępny), ale jeśli udało ci się zainstalować Go, prawdopodobnie masz już uprawnienia roota.
2) Po utworzeniu wszystkich kompilatorów krzyżowych możesz z radością skompilować swoją aplikację przy użyciu następujących ustawień, na przykład:
Zmień GOOS i GOARCH na cele, które chcesz zbudować.
Jeśli napotkasz problemy z CGO, umieść CGO_ENABLED = 0 w linii poleceń. Zauważ również, że pliki binarne dla Linuksa i Maca nie mają rozszerzenia, więc możesz dodać rozszerzenie, aby mieć różne pliki. -o przełącznik instruuje Go, aby plik wyjściowy był podobny do starych kompilatorów dla c / c ++, więc powyżej używanego appname.linux może być dowolnym innym rozszerzeniem.
źródło
# Building compilers and Go bootstrap tool for host, darwin/amd64
ale później faktycznie kończy się jako:--- Installed Go for windows/386 in /usr/local/go Installed commands in /usr/local/go/bin
tak więc należy obserwować raczej zakończenie niż początek kompilacji kompilatora.$ GOARCH=386 GOOS=linux go build app.go
i otrzymania błędu# 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
Jeśli używasz Homebrew na OS X, masz prostsze rozwiązanie:
lub..
Użyj,
reinstall
jeśli jużgo
zainstalowałeś.źródło
--cross-compile-all
jest teraz--with-cc-all
Możesz to zrobić dość łatwo za pomocą Dockera, więc nie są wymagane żadne dodatkowe biblioteki. Po prostu uruchom to polecenie:
Więcej szczegółów znajdziesz w tym poście: https://medium.com/iron-io-blog/how-to-cross-compile-go-programs-using-docker-beaa102a316d
źródło
env GOOS=x GOARCH=y go install something/...
i skończyć z odpowiednimi plikami binarnymi pod$GOPATH/bin/$GOOS_$GOARCH
?? A tak przy okazji, Go obsługuje więcej niż trzy systemy operacyjne, które wymieniasz, dlaczego nie kochasz BSD?Proces tworzenia plików wykonywalnych dla wielu platform może być trochę uciążliwy, dlatego sugeruję użycie skryptu:
Sprawdziłem ten skrypt tylko na OSX
istota - go-executable-build.sh
źródło
Potrzebowałem CGO włączonego podczas kompilacji dla Windows z mojego Maca, ponieważ zaimportowałem https://github.com/mattn/go-sqlite3 i potrzebowałem tego. Kompilacja według innych odpowiedzi dała mi błąd:
Jeśli jesteś podobny do mnie i musisz skompilować się z CGO. Oto co zrobiłem:
1. Zamierzamy skompilować krzyżowo dla Windows z biblioteką zależną od CGO. Najpierw musimy zainstalować kompilator krzyżowy, taki jak
mingw-w64
To prawdopodobnie zainstaluje go tutaj
/usr/local/opt/mingw-w64/bin/
.2. Podobnie jak w przypadku innych odpowiedzi, musimy najpierw dodać naszą archiwa Windows do naszego zestawu narzędzi kompilatora go. Kompilacja kompilatora wymaga kompilatora (dziwne zdanie) Kompilacja go wymaga oddzielnego, wstępnie zbudowanego kompilatora. Możemy pobrać wstępnie skompilowany plik binarny lub skompilować ze źródła w folderze, np .:
~/Documents/go
teraz możemy ulepszyć nasz kompilator Go, zgodnie z najlepszą odpowiedzią, ale tym razem zCGO_ENABLED=1
naszym oddzielnym wstępnie skompilowanym kompilatoremGOROOT_BOOTSTRAP
(Pooya to moja nazwa użytkownika):3. Teraz podczas kompilowania naszego kodu Go użyj
mingw
do skompilowania naszego pliku go przeznaczonego dla okien z włączonym CGO:źródło