Skip to content
2 / 15

Кросс-компиляция: GOOS, GOARCH и когда это перестаёт работать

Go умеет собирать под чужую платформу без всякого окружения: достаточно задать GOOS и GOARCH, и компилятор выдаст бинарник для неё — с macOS под Linux, с Linux под Windows, под ARM и x86 одинаково. Работает это потому, что весь код, включая стандартную библиотеку, компилируется из исходников, а системные вызовы Go делает сам, не полагаясь на локальные заголовки. Ломается ровно в одном месте — при включённом CGO: компилировать C-код под чужую платформу без соответствующего кросс-компилятора нельзя, и CGO_ENABLED=1 по умолчанию включён для сборки под родную платформу. Отсюда рецепт CGO_ENABLED=0, который в подавляющем большинстве серверных сервисов ничего не ломает и заодно даёт статический бинарник. Для ARM есть дополнительная ось GOARM, а для Apple Silicon и серверов Graviton достаточно GOARCH=arm64. Полный список поддерживаемых пар выдаёт go tool dist list.

Кросс-компиляция: GOOS, GOARCH и когда это перестаёт работать | JScriptiser