Cross compile Go na OSX?

Próbuję skompilować aplikację go na OSX, aby zbudować binaria dla windows i linux. Przeczytałem wszystko, co znalazłem w sieci. Najbliższy przykład, który znalazłem, został opublikowany (poza wieloma niedokończonymi dyskusjami na liście dyskusyjnej go-nuts): {]}

Http://solovyov.net/en/2012/03/09/cross-compiling-go/

Jednak nie działa na mojej instalacji. Mam go 1.0.2. Jako, że 1.0.2 jest całkiem niedawno wygląda mi na to, że wszystkie powyższe przykłady nie mają zastosowania do tego wersja.

Próbowałem zrobić ./make.bash --no-clean z ENV vars ustawionym na 386 / windows, To build go, jednak buduje go dla mojej instalacji, która jest darwin/amd64 i całkowicie ignoruje to, co jest ustawione w ENV, które mają budować inny kompilator.

Ktoś radzi, jak można to zrobić (jeśli w ogóle można to zrobić)?

Author: Wolf, 2012-08-29

5 answers

Z Go 1.5 wydaje się, że poprawili proces kompilacji krzyżowej, co oznacza, że jest on teraz wbudowany. Nie jest wymagane ./make.bash-ING lub brew-ING. Proces jest opisany tutaj ale dla TLDR-ers (jak ja) tam: wystarczy ustawić GOOS i GOARCH Zmienne środowiskowe i uruchomić go build.

Dla jeszcze bardziej leniwych copy-pasterów (jak ja), zrób coś takiego, jeśli jesteś na systemie *nix:

env GOOS=linux GOARCH=arm go build -v github.com/path/to/your/app

Nauczyłeś się nawet env sztuczki, która pozwala Ci ustawić zmienne środowiskowe tylko dla tego polecenia, całkowicie za darmo.

 99
Author: meonlol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-08 21:43:53

Dzięki życzliwej i cierpliwej pomocy golang-nuts, przepis jest następujący:

1) trzeba skompilować go kompilator dla różnych platform docelowych i architektur. Odbywa się to z folderu src w instalacji go. W moim przypadku instalacja go znajduje się w /usr/local/go więc aby skompilować kompilator musisz wydać make utility. Zanim to zrobisz, musisz znać pewne zastrzeżenia.

Jest problem z biblioteką CGO podczas kompilacji krzyżowej, więc konieczne jest wyłączenie CGO biblioteka.

Kompilowanie odbywa się poprzez zmianę lokalizacji na źródłowy katalog, ponieważ kompilowanie musi odbywać się w tym folderze

cd /usr/local/go/src

Następnie Kompiluj go kompilator:

sudo GOOS=windows GOARCH=386 CGO_ENABLED=0 ./make.bash --no-clean

Musisz powtórzyć ten krok dla każdego systemu operacyjnego i Architektury, którą chcesz skompilować, 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 super user. Na komputerze Mac może być konieczne włącz/skonfiguruj dostęp do SU (domyślnie nie jest dostępny), ale jeśli udało Ci się zainstalować go, prawdopodobnie masz już dostęp do roota.

2) Po zbudowaniu wszystkich kompilatorów krzyżowych, możesz szczęśliwie skompilować swoją aplikację za pomocą ustawień na przykład:

GOOS=windows GOARCH=386 go build -o appname.exe appname.go

GOOS=linux GOARCH=386 CGO_ENABLED=0 go build -o appname.linux appname.go

Zmień GOOS i GOARCH na cele, które chcesz zbudować.

Jeśli napotkasz problem z CGO include CGO_ENABLED=0 w wierszu poleceń, zwróć również uwagę, że pliki binarne dla Linuksa i Maca nie mają rozszerzenia, więc może dodać rozszerzenie ze względu na posiadanie różnych plików. -o Switch instruuje go, aby plik wyjściowy był podobny do starych kompilatorów c / C++ , a więc powyżej użytej nazwy aplikacji.linux może być dowolnym innym rozszerzeniem.

 133
Author: ljgww,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-31 06:10:41

Jeśli używasz Homebrew na OS X, masz prostsze rozwiązanie:

$ brew install go --with-cc-common # Linux, Darwin, and Windows

Lub..

$ brew install go --with-cc-all # All the cross-compilers

Użyj reinstall, Jeśli masz już zainstalowany go.

 61
Author: docwhat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-14 15:09:11

Możesz to zrobić dość łatwo używając Dockera, więc nie są wymagane dodatkowe biblioteki. Po prostu uruchom to polecenie:

docker run --rm -it -v "$GOPATH":/go -w /go/src/github.com/iron-io/ironcli golang:1.4.2-cross sh -c '
for GOOS in darwin linux windows; do
  for GOARCH in 386 amd64; do
    echo "Building $GOOS-$GOARCH"
    export GOOS=$GOOS
    export GOARCH=$GOARCH
    go build -o bin/ironcli-$GOOS-$GOARCH
  done
done
'
Więcej szczegółów znajdziesz w tym poście: https://medium.com/iron-io-blog/how-to-cross-compile-go-programs-using-docker-beaa102a316d
 16
Author: Travis Reeder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-08 20:52:49

Dla osób, które potrzebują CGO włączone i cross compile z OSX targeting windows

I needed CGO enabled while compiling for windows from my mac since I had imported the https://github.com/mattn/go-sqlite3 i potrzebowało tego. Zestawianie według innych udzielonych mi odpowiedzi i błędów:

/usr/local/go/src/runtime/cgo/gcc_windows_amd64.c:8:10: fatal error: 'windows.h' file not found

Jeśli jesteś taki jak ja i musisz kompilować z CGO. Tak zrobiłem:

1.Będziemy krzyżować kompilację dla windows z biblioteką zależną od CGO. Najpierw musimy zainstalować kompilator krzyżowy, taki jak mingw-w64

brew install mingw-w64

To prawdopodobnie zainstaluje go tutaj /usr/local/opt/mingw-w64/bin/.

2.Podobnie jak inne odpowiedzi, musimy teraz dodać nasz windows arch do naszego zestawu narzędzi kompilatora go. Kompilowanie kompilator potrzebuje kompilatora (dziwne zdanie) kompilowanie go kompilator potrzebuje oddzielnego kompilatora. Możemy pobrać prebuilt binary lub build ze źródła w folderze np: ~/Documents/go teraz możemy ulepszyć nasz kompilator Go, według top odpowiedz, ale tym razem z CGO_ENABLED=1 i naszym oddzielnym prebuiltowym kompilatorem GOROOT_BOOTSTRAP (Pooya to moja nazwa użytkownika):

cd /usr/local/go/src
sudo GOOS=windows GOARCH=amd64 CGO_ENABLED=1 GOROOT_BOOTSTRAP=/Users/Pooya/Documents/go ./make.bash --no-clean
sudo GOOS=windows GOARCH=386 CGO_ENABLED=1 GOROOT_BOOTSTRAP=/Users/Pooya/Documents/go ./make.bash --no-clean

3.Teraz podczas kompilacji naszego kodu Go użyj mingw, aby skompilować nasz plik go kierujący okna z włączonym CGO:

GOOS="windows" GOARCH="386" CGO_ENABLED="1" CC="/usr/local/opt/mingw-w64/bin/i686-w64-mingw32-gcc" go build hello.go
GOOS="windows" GOARCH="amd64" CGO_ENABLED="1" CC="/usr/local/opt/mingw-w64/bin/x86_64-w64-mingw32-gcc" go build hello.go
 3
Author: Pouya Sanooei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-17 13:49:52