golang кросс-компилируется под Mac, Linux, Windows

Сообщество самородков

предисловие

Golang поддерживает кросс-компиляцию, которая создается на одной платформе и выполняется на другой платформе. А скомпилированный инструмент [build] собран на Golang, поэтому вам не нужно скачивать сторонние пакеты, что очень удобно.

перекрестная компиляция

Скомпилируйте под Mac, выполните под Linux или Windows

# linux 下去执行
CGO_ENABLED=0  GOOS=linux  GOARCH=amd64  go build main.go
# Windows 下去执行
CGO_ENABLED=0 GOOS=windows  GOARCH=amd64  go  build  main.go

Скомпилируйте под Linux, запустите на Mac или Windows

# Mac  下去执行
CGO_ENABLED=0 GOOS=darwin  GOARCH=amd64  go build main.go
# Windows 下执行
CGO_ENABLED=0 GOOS=windows  GOARCH=amd64  go build main.go

Выполнить под Windows, Выполнить под Mac или Linux

Вам нужно написать пакетную программу и установить ее в ней, потому что терминал под windows не поддерживает шелл, который немного отличается от того, что под Mac и Linux

# Mac 下执行
SET  CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build main.go
# Linux 去执行
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build main.go

Параметр Описание

  • CGO_ENABLED: CGO означает инструменты в golang, CGO_ENABLED означает, что CGO отключен, и CGO нельзя использовать в кросс-компиляции
  • GOOS: целевая платформа
    • мак перепискаdarwin
    • соответствующий линуксlinux
    • соответствующий окнамwindows
  • GOARCH: Архитектура целевой платформы [386, amd64, arm], текущие персональные компьютеры на рынке, как правило, имеют архитектуру amd64.
    • 386, также известный как x86 для 32-разрядных операционных систем.
    • amd64, также известный как x64 для 64-битных операционных систем.
    • arm Эта архитектура обычно используется для разработки встраиваемых систем. Такие как Android, IOS, Win mobile, TIZEN и т. д.

Почему параметры перед go build под linux или Mac нужно выставлять именно так?

go envМы можем перечислить наши переменные среды по умолчанию для golang.Если мы хотим изменить переменные среды только один раз в оболочке, мы можем изменить эту переменную среды, установив переменные в оболочке.

кейс

//默认
>#go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/data/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build171002917=/tmp/go-build -gno-record-gcc-switches"
>#

//更改
>#CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go env
GOARCH="amd64"  # 变更了
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOEXE=".exe"
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="windows" #  变更了
GOPATH="/data/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="0"  # 变更了
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-m64 -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build668031908=/tmp/go-build -gno-record-gcc-switches"
>#

// 更改后
>#go env
GOARCH="amd64" # 还原了
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"      # 默认值
GOPATH="/data/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build240557259=/tmp/go-build -gno-record-gcc-switches"
>#
Категории