Глиф Учебники

Как собрать программу под Windows из Linux

Справочник · Go · 2 минуты чтения

Go умеет собирать программу для другой системы без всяких дополнительных инструментов. Систему и процессор задают переменными окружения (настройками, которые программа получает при запуске) GOOS и GOARCH. В Linux и macOS их пишут в терминале прямо перед командой:

Bash
GOOS=windows GOARCH=amd64 go build -o hello.exe .

В папке появится hello.exe — его можно скопировать на компьютер с Windows и запустить. Сам Go в Windows для этого не нужен.

Частые сочетания

КудаGOOSGOARCH
Windows, обычный компьютерwindowsamd64
Windows на ARMwindowsarm64
Linux-серверlinuxamd64
Raspberry Pi с 64-битной системой, серверы на ARMlinuxarm64
Raspberry Pi с 32-битной системойlinuxarm и GOARM=7 (для Pi Zero и Pi 1 — GOARM=6)
Mac на процессоре Apple (M1 и новее)darwinarm64
Mac на процессоре Inteldarwinamd64

amd64 — обычные 64-битные процессоры Intel и AMD. Полный список поддерживаемых сочетаний печатает go tool dist list. Какие значения у вашего компьютера, показывает go env GOOS GOARCH.

Несколько сборок подряд:

Bash
GOOS=linux GOARCH=amd64 go build -o hello-linux .
GOOS=linux GOARCH=arm64 go build -o hello-arm64 .
GOOS=darwin GOARCH=arm64 go build -o hello-mac .

Если не указывать -o, файл назовётся по модулю, а для Windows Go сам добавит .exe.

Из Windows под Linux

В Windows переменные задают отдельными командами, и запись зависит от оболочки — выберите свою.

PowerShell

PowerShell
$env:GOOS = "linux"
$env:GOARCH = "amd64"
go build -o hello .
Remove-Item Env:GOOS
Remove-Item Env:GOARCH

Командная строка (cmd)

Командная строка
set GOOS=linux
set GOARCH=amd64
go build -o hello .
set GOOS=
set GOARCH=

Последние две строки в обоих вариантах возвращают обычные значения. Если их забыть, все следующие go build и даже go run в этом окне будут собирать программу для Linux, и go run перестанет запускаться.

Готовый файл копируют на сервер (например, scp hello user@сервер:) и там разрешают его запуск: chmod +x hello, затем ./hello.

Если программа использует cgo

Некоторые пакеты содержат код на C (это называется cgo) — например, драйвер SQLite go-sqlite3. При сборке под другую систему cgo по умолчанию выключен, и такие пакеты не соберутся или соберутся без нужной части. Варианты:

Явно выключить cgo и получить файл без внешних зависимостей можно переменной CGO_ENABLED=0:

Bash
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o hello .

Такой файл удобно класть в минимальные образы Docker.

Полезные флаги сборки

Bash
GOOS=windows GOARCH=amd64 go build -trimpath -ldflags="-s -w" -o hello.exe .

Файл, собранный для одной системы, на другой не запустится: в Linux .exe даст ошибку формата, а в Windows файл для Linux — сообщение, что приложение невозможно запустить. Проверьте GOOS и GOARCH, если видите такое.