Go
Kompilacja krzyżowa
Szukaj…
Wprowadzenie
Kompilator Go może produkować pliki binarne dla wielu platform, tj. Procesorów i systemów. W przeciwieństwie do większości innych kompilatorów, nie ma szczególnych wymagań dotyczących kompilacji krzyżowej, jest równie łatwy w użyciu jak zwykła kompilacja.
Składnia
- GOOS = linux GOARCH = amd64 go build
Uwagi
Obsługiwane kombinacje docelowe systemu operacyjnego i architektury (źródło)
$ GOOS | $ GOARCH |
---|---|
android | ramię |
Darwin | 386 |
Darwin | amd64 |
Darwin | ramię |
Darwin | arm64 |
ważka | amd64 |
freebsd | 386 |
freebsd | amd64 |
freebsd | ramię |
linux | 386 |
linux | amd64 |
linux | ramię |
linux | arm64 |
linux | ppc64 |
linux | ppc64le |
linux | mips64 |
linux | mips64le |
netbsd | 386 |
netbsd | amd64 |
netbsd | ramię |
openbsd | 386 |
openbsd | amd64 |
openbsd | ramię |
plan9 | 386 |
plan9 | amd64 |
solaris | amd64 |
Windows | 386 |
Windows | amd64 |
Skompiluj wszystkie architektury za pomocą pliku Makefile
Ten Makefile będzie krzyżował pliki wykonywalne kompilacji i zipów dla systemów Windows, Mac i Linux (ARM i x86).
# Replace demo with your desired executable name
appname := demo
sources := $(wildcard *.go)
build = GOOS=$(1) GOARCH=$(2) go build -o build/$(appname)$(3)
tar = cd build && tar -cvzf $(1)_$(2).tar.gz $(appname)$(3) && rm $(appname)$(3)
zip = cd build && zip $(1)_$(2).zip $(appname)$(3) && rm $(appname)$(3)
.PHONY: all windows darwin linux clean
all: windows darwin linux
clean:
rm -rf build/
##### LINUX BUILDS #####
linux: build/linux_arm.tar.gz build/linux_arm64.tar.gz build/linux_386.tar.gz build/linux_amd64.tar.gz
build/linux_386.tar.gz: $(sources)
$(call build,linux,386,)
$(call tar,linux,386)
build/linux_amd64.tar.gz: $(sources)
$(call build,linux,amd64,)
$(call tar,linux,amd64)
build/linux_arm.tar.gz: $(sources)
$(call build,linux,arm,)
$(call tar,linux,arm)
build/linux_arm64.tar.gz: $(sources)
$(call build,linux,arm64,)
$(call tar,linux,arm64)
##### DARWIN (MAC) BUILDS #####
darwin: build/darwin_amd64.tar.gz
build/darwin_amd64.tar.gz: $(sources)
$(call build,darwin,amd64,)
$(call tar,darwin,amd64)
##### WINDOWS BUILDS #####
windows: build/windows_386.zip build/windows_amd64.zip
build/windows_386.zip: $(sources)
$(call build,windows,386,.exe)
$(call zip,windows,386,.exe)
build/windows_amd64.zip: $(sources)
$(call build,windows,amd64,.exe)
$(call zip,windows,amd64,.exe)
(bądź ostrożny, że Makefile potrzebuje twardych tabulatorów, a nie spacji )
Prosta kompilacja krzyżowa z kompilacją go
Z katalogu projektu uruchom komendę go build
i określ docelowy system operacyjny i architekturę za pomocą zmiennych środowiskowych GOOS
i GOARCH
:
Kompilacja dla komputerów Mac (64-bitowych):
GOOS=darwin GOARCH=amd64 go build
Kompilowanie dla procesora Windows x86:
GOOS=windows GOARCH=386 go build
Możesz także ustawić ręcznie nazwę pliku wyjściowego pliku wykonywalnego, aby śledzić architekturę:
GOOS=windows GOARCH=386 go build -o appname_win_x86.exe
Od wersji 1.7 i nowszych możesz uzyskać listę wszystkich możliwych kombinacji GOOS i GOARCH z:
go tool dist list
(lub dla łatwiejszego zużycia maszyny go tool dist list -json
)
Kompilacja krzyżowa przy użyciu gox
Kolejnym wygodnym rozwiązaniem kompilacji krzyżowej jest użycie gox
: https://github.com/mitchellh/gox
Instalacja
Instalacja odbywa się bardzo łatwo poprzez uruchomienie go get github.com/mitchellh/gox
. Wynikowy plik wykonywalny zostaje umieszczony w katalogu binarnym Go, np. /golang/bin
lub ~/golang/bin
. Upewnij się, że ten folder jest częścią ścieżki, aby użyć polecenia gox
z dowolnej lokalizacji.
Stosowanie
Z poziomu folderu głównego projektu Go (gdzie wykonujesz np. gox
go build
), uruchom gox
, aby zbudować wszystkie możliwe pliki binarne dla dowolnej architektury (np. X86, ARM) i systemu operacyjnego (np. Linux, macOS, Windows), który jest dostępny.
Aby zbudować dla określonego systemu operacyjnego, użyj np. gox -os="linux"
. Można również zdefiniować opcję architektury: gox -osarch="linux/amd64"
.
Prosty przykład: skompiluj helloworld.go dla architektury uzbrojenia na komputerze z systemem Linux
Przygotuj helloworld.go (znajdź poniżej)
package main
import "fmt"
func main(){
fmt.Println("hello world")
}
Uruchom GOOS=linux GOARCH=arm go build helloworld.go
Skopiuj wygenerowany helloworld
(wykonywalny przez ramię) na maszynę docelową.