Go
Кросс-компиляция
Поиск…
Вступление
Компилятор Go может создавать двоичные файлы для многих платформ, то есть процессоров и систем. В отличие от большинства других компиляторов, нет особых требований к кросс-компиляции, он так же прост в использовании, как и регулярная компиляция.
Синтаксис
- GOOS = linux GOARCH = amd64 go build
замечания
Поддерживаемые целевые комбинации операционной системы и архитектуры (источник)
$ GOOS | $ GOARCH |
---|---|
андроид | рука |
Дарвин | 386 |
Дарвин | amd64 |
Дарвин | рука |
Дарвин | arm64 |
стрекоза | amd64 |
FreeBSD | 386 |
FreeBSD | amd64 |
FreeBSD | рука |
линукс | 386 |
линукс | amd64 |
линукс | рука |
линукс | arm64 |
линукс | ppc64 |
линукс | ppc64le |
линукс | MIPS64 |
линукс | mips64le |
NetBSD | 386 |
NetBSD | amd64 |
NetBSD | рука |
OpenBSD | 386 |
OpenBSD | amd64 |
OpenBSD | рука |
plan9 | 386 |
plan9 | amd64 |
Солярис | amd64 |
окна | 386 |
окна | amd64 |
Скомпилируйте все архитектуры с помощью Makefile
Этот Makefile перекрестно скомпилирует и запустит исполняемые файлы для Windows, Mac и Linux (ARM и 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)
(будьте осторожны, чтобы жесткие вкладки Makefile не были пробелами )
Простая кросс-компиляция с go build
В каталоге проекта запустите команду go build
и укажите целевую систему операционной системы и архитектуры с переменными среды GOOS
и GOARCH
:
Компиляция для Mac (64-разрядная версия):
GOOS=darwin GOARCH=amd64 go build
Компиляция для процессора Windows x86:
GOOS=windows GOARCH=386 go build
Вы также можете указать имя исполняемого файла вывода вручную, чтобы отслеживать архитектуру:
GOOS=windows GOARCH=386 go build -o appname_win_x86.exe
Начиная с версии 1.7 и далее вы можете получить список всех возможных комбинаций GOOS и GOARCH с:
go tool dist list
(или для более легкого расходования машины, go tool dist list -json
)
Кросс-компиляция с помощью gox
Другим удобным решением для кросс-компиляции является использование gox
: https://github.com/mitchellh/gox
Монтаж
Установка выполняется очень легко, выполнив go get github.com/mitchellh/gox
. Получаемый исполняемый файл помещается в двоичный каталог Go, например /golang/bin
или ~/golang/bin
. Убедитесь, что эта папка является частью вашего пути, чтобы использовать команду gox
из произвольного местоположения.
использование
В корневой папке проекта Go (где вы выполняете, например, выполните go build
), выполните gox
, чтобы создать все возможные бинарные файлы для любой архитектуры (например, x86, ARM) и операционной системы (например, Linux, macOS, Windows), которая доступна.
Чтобы создать определенную операционную систему, используйте, например, gox -os="linux"
. Также может быть определен параметр архитектуры: gox -osarch="linux/amd64"
.
Простой пример: компиляция helloworld.go для архитектуры arm на машине Linux
Подготовьте helloworld.go (найдите ниже)
package main
import "fmt"
func main(){
fmt.Println("hello world")
}
Запустить GOOS=linux GOARCH=arm go build helloworld.go
Скопируйте сгенерированный helloworld
(arm executable) на вашу целевую машину.