Как собрать программу под Windows из Linux
Go умеет собирать программу для другой системы без всяких дополнительных инструментов. Систему и процессор задают переменными окружения (настройками, которые программа получает при запуске) GOOS и GOARCH. В Linux и macOS их пишут в терминале прямо перед командой:
GOOS=windows GOARCH=amd64 go build -o hello.exe .В папке появится hello.exe — его можно скопировать на компьютер с Windows и запустить. Сам Go в Windows для этого не нужен.
Частые сочетания
| Куда | GOOS | GOARCH |
|---|---|---|
| Windows, обычный компьютер | windows | amd64 |
| Windows на ARM | windows | arm64 |
| Linux-сервер | linux | amd64 |
| Raspberry Pi с 64-битной системой, серверы на ARM | linux | arm64 |
| Raspberry Pi с 32-битной системой | linux | arm и GOARM=7 (для Pi Zero и Pi 1 — GOARM=6) |
| Mac на процессоре Apple (M1 и новее) | darwin | arm64 |
| Mac на процессоре Intel | darwin | amd64 |
amd64 — обычные 64-битные процессоры Intel и AMD. Полный список поддерживаемых сочетаний печатает go tool dist list. Какие значения у вашего компьютера, показывает go env GOOS GOARCH.
Несколько сборок подряд:
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
$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 по умолчанию выключен, и такие пакеты не соберутся или соберутся без нужной части. Варианты:
- взять пакет, написанный целиком на Go (у многих популярных библиотек такой есть);
- собирать на той системе, для которой нужна программа, — или в контейнере Docker с этой системой.
Явно выключить cgo и получить файл без внешних зависимостей можно переменной CGO_ENABLED=0:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o hello .Такой файл удобно класть в минимальные образы Docker.
Полезные флаги сборки
-ldflags="-s -w"— убрать отладочную информацию, файл станет меньше.-ldflags="-H windowsgui"— для программ Windows с окнами: при запуске не появится чёрное окно консоли.-trimpath— не записывать в файл пути к папкам вашего компьютера.
GOOS=windows GOARCH=amd64 go build -trimpath -ldflags="-s -w" -o hello.exe .Файл, собранный для одной системы, на другой не запустится: в Linux .exe даст ошибку формата, а в Windows файл для Linux — сообщение, что приложение невозможно запустить. Проверьте GOOS и GOARCH, если видите такое.