Я пытаюсь перекрестно скомпилировать приложение go на OSX для создания двоичных файлов для Windows и Linux. Я прочитал все, что смог найти в сети. Ближайший пример, который я нашел, был опубликован (не считая многих незаконченных обсуждений в списке рассылки глупых людей):
http://solovyov.net/en/2012/03/09/cross-compiling-go/
пока что это не работает на моей установке. У меня есть версия 1.0.2. Поскольку 1.0.2 появилась совсем недавно, мне кажется, что все вышеперечисленные примеры не применимы к этой версии.
Пытался сделать ./make.bash --no-clean
с переменными ENV, установленными на 386 / windows, сборка идет, однако сборка идет для моей установки, которая darwin/amd64
полностью игнорирует то, что установлено в ENV, которое предполагает сборку другого компилятора.
Какие-либо советы, как это можно сделать (если это вообще возможно)?
источник
sudo
(вероятно, я бы получил другой unix ENV при sudo-ing, поэтому GOOS и GOARCH не будут доступны, если они не будут выполнены inline)CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash
- если вы попытались разделить его более чем на одну строку, то переменная среды не будет экспортирована, что соответствует симптомамОтветы:
В Go 1.5 они, кажется, улучшили процесс кросс-компиляции, то есть теперь он встроен. Нет
./make.bash
-ную илиbrew
-ную требуется. Процесс описан здесь, но для участников TLDR (таких как я): вы просто устанавливаетеGOOS
иGOARCH
переменные среды и запускаете сборку go.Для еще более ленивых копипастеров (вроде меня) сделайте что-нибудь вроде этого, если вы используете систему * nix:
env GOOS=linux GOARCH=arm go build -v github.com/path/to/your/app
Вы даже научились
env
трюку, который позволяет вам совершенно бесплатно устанавливать переменные среды только для этой команды.источник
env
запускает только этот вызов в настраиваемой среде и «сбрасывает» его после завершения. Например, запуститьexport GOOS=windows
, затем команду с или безenv
иecho $GOOS
после. Сenv
ГСНО ничего не изменилось.env
. Я побежал ,export GOOS=windows
тоGOOS=linux bash -c 'echo "GOOS: $GOOS"'
потомecho "GOOS: $GOOS"
.env
Обеспечивает ли большую совместимость с другими диалектами оболочки или с другими платформами? Если нет, то здесь это кажется лишним.FOO=bar cmd
, поэтому вам придется использоватьenv FOO=bar cmd
. Таким образом, я считаю, что самым большим преимуществом использованияenv FOO=bar cmd
является совместимость.env GOOS=linux GOARCH=386 go build -v github.com/path/to/your/app
и она работает как чемпионБлагодаря доброй и терпеливой помощи голанг-орехов рецепт такой:
1) Нужно скомпилировать компилятор Go для разных целевых платформ и архитектур. Это делается из папки src в установке go. В моем случае установка Go находится в нем,
/usr/local/go
поэтому для компиляции компилятора нужно выпуститьmake
утилиту. Перед тем как это сделать, вам нужно знать некоторые предостережения.При кросс-компиляции возникает проблема с библиотекой CGO, поэтому необходимо отключить библиотеку CGO.
Компиляция выполняется путем изменения местоположения на исходный каталог, поскольку компиляция должна выполняться в этой папке
cd /usr/local/go/src
затем скомпилируйте компилятор Go:
sudo GOOS=windows GOARCH=386 CGO_ENABLED=0 ./make.bash --no-clean
Вам нужно повторить этот шаг для каждой ОС и каждой архитектуры, которые вы хотите кросс-компилировать, изменив параметры GOOS и GOARCH.
Если вы работаете в пользовательском режиме, как я, sudo необходимо, потому что компилятор Go находится в системном каталоге. В противном случае вам нужно будет войти в систему как суперпользователь. На Mac вам может потребоваться включить / настроить доступ SU (по умолчанию он недоступен), но если вам удалось установить Go, возможно, у вас уже есть root-доступ.
2) После того, как вы построили все кросс-компиляторы, вы можете с радостью скомпилировать свое приложение, используя, например, следующие настройки:
GOOS=windows GOARCH=386 go build -o appname.exe appname.go GOOS=linux GOARCH=386 CGO_ENABLED=0 go build -o appname.linux appname.go
Измените GOOS и GOARCH на цели, которые вы хотите построить.
Если у вас возникнут проблемы с CGO, включите CGO_ENABLED = 0 в командную строку. Также обратите внимание, что двоичные файлы для Linux и Mac не имеют расширения, поэтому вы можете добавить расширение, чтобы иметь разные файлы. -o переключатель указывает Go сделать выходной файл похожим на старые компиляторы для c / c ++, таким образом, использованное выше имя приложения. linux может быть любым другим расширением.
источник
# Building compilers and Go bootstrap tool for host, darwin/amd64
но позже это фактически заканчивается как:--- Installed Go for windows/386 in /usr/local/go Installed commands in /usr/local/go/bin
так что нужно наблюдать окончание, а не начало компиляции.$ GOARCH=386 GOOS=linux go build app.go
и получения ошибки# runtime /usr/local/go/src/pkg/runtime/extern.go:137: undefined: theGoos /usr/local/go/src/pkg/runtime/extern.go:137: cannot use theGoos as type string in const initializer
brew reinstall go --cross-compile-all
Если вы используете Homebrew в OS X, у вас есть более простое решение:
$ brew install go --with-cc-common # Linux, Darwin, and Windows
или..
$ brew install go --with-cc-all # All the cross-compilers
Используйте,
reinstall
если вы ужеgo
установили.источник
--cross-compile-all
сейчас--with-cc-all
Вы можете сделать это довольно легко с помощью Docker, поэтому дополнительных библиотек не требуется. Просто запустите эту команду:
docker run --rm -it -v "$GOPATH":/go -w /go/src/github.com/iron-io/ironcli golang:1.4.2-cross sh -c ' for GOOS in darwin linux windows; do for GOARCH in 386 amd64; do echo "Building $GOOS-$GOARCH" export GOOS=$GOOS export GOARCH=$GOARCH go build -o bin/ironcli-$GOOS-$GOARCH done done '
Вы можете найти более подробную информацию в этом сообщении: https://medium.com/iron-io-blog/how-to-cross-compile-go-programs-using-docker-beaa102a316d
источник
env GOOS=x GOARCH=y go install something/...
и получить соответствующие двоичные файлы под$GOPATH/bin/$GOOS_$GOARCH
?? И, кстати, Go поддерживает более трех перечисленных вами операционных систем, почему нет любви к BSD?Процесс создания исполняемых файлов для многих платформ может быть немного утомительным, поэтому я предлагаю использовать скрипт:
#!/usr/bin/env bash package=$1 if [[ -z "$package" ]]; then echo "usage: $0 <package-name>" exit 1 fi package_name=$package #the full list of the platforms: https://golang.org/doc/install/source#environment platforms=( "darwin/386" "dragonfly/amd64" "freebsd/386" "freebsd/amd64" "freebsd/arm" "linux/386" "linux/amd64" "linux/arm" "linux/arm64" "netbsd/386" "netbsd/amd64" "netbsd/arm" "openbsd/386" "openbsd/amd64" "openbsd/arm" "plan9/386" "plan9/amd64" "solaris/amd64" "windows/amd64" "windows/386" ) for platform in "${platforms[@]}" do platform_split=(${platform//\// }) GOOS=${platform_split[0]} GOARCH=${platform_split[1]} output_name=$package_name'-'$GOOS'-'$GOARCH if [ $GOOS = "windows" ]; then output_name+='.exe' fi env GOOS=$GOOS GOARCH=$GOARCH go build -o $output_name $package if [ $? -ne 0 ]; then echo 'An error has occurred! Aborting the script execution...' exit 1 fi done
Я проверил этот скрипт только на OSX
суть - go-executable-build.sh
источник
Мне нужно было включить CGO при компиляции для Windows с моего Mac, так как я импортировал https://github.com/mattn/go-sqlite3, и он нуждался в нем. Компиляция в соответствии с другими ответами дала мне и ошибку:
/usr/local/go/src/runtime/cgo/gcc_windows_amd64.c:8:10: fatal error: 'windows.h' file not found
Если вы похожи на меня и вам нужно компилировать с CGO. Вот что я сделал:
1. Мы собираемся кросс-компиляцию для Windows с зависимой библиотекой CGO. Сначала нам нужен кросс-компилятор, например
mingw-w64
Это, вероятно, установит его здесь
/usr/local/opt/mingw-w64/bin/
.2. Как и в других ответах, нам сначала нужно добавить нашу арку Windows в нашу инструментальную цепочку компилятора go. Для компиляции компилятора нужен компилятор (странное предложение). Для компиляции компилятора go нужен отдельный предварительно собранный компилятор. Мы можем загрузить предварительно созданный двоичный файл или выполнить сборку из исходного кода в папке, например:
~/Documents/go
теперь мы можем улучшить наш компилятор Go, в соответствии с верхним ответом, но на этот раз сCGO_ENABLED=1
нашим отдельным предварительно созданным компиляторомGOROOT_BOOTSTRAP
(Pooya - мое имя пользователя):cd /usr/local/go/src sudo GOOS=windows GOARCH=amd64 CGO_ENABLED=1 GOROOT_BOOTSTRAP=/Users/Pooya/Documents/go ./make.bash --no-clean sudo GOOS=windows GOARCH=386 CGO_ENABLED=1 GOROOT_BOOTSTRAP=/Users/Pooya/Documents/go ./make.bash --no-clean
3.Теперь при компиляции нашего кода Go используйте
mingw
для компиляции наших окон с таргетингом на файлы go с включенным CGO:GOOS="windows" GOARCH="386" CGO_ENABLED="1" CC="/usr/local/opt/mingw-w64/bin/i686-w64-mingw32-gcc" go build hello.go GOOS="windows" GOARCH="amd64" CGO_ENABLED="1" CC="/usr/local/opt/mingw-w64/bin/x86_64-w64-mingw32-gcc" go build hello.go
источник