Кросс-компиляция идет на OSX?
Я пытаюсь скомпилировать приложение go на OSX для создания двоичных файлов для windows и linux. Я прочитал все, что смог найти в сети. Самый близкий пример, который я нашел, был опубликован (помимо многих незавершенных обсуждений в списке рассылки go-nuts):
http://solovyov.net/en/2012/03/09/cross-compiling-go/
но это не работает на моей установке. У меня есть go 1.0.2. Поскольку 1.0.2 совсем недавно, мне кажется, что все вышеперечисленные примеры не применяется к этой версии.
пытался сделать ./make.bash --no-clean
с ENV vars, установленным в 386 / windows, он строит go, однако он строит go для моей установки, которая darwin/amd64
и полностью игнорирует то, что установлено в ENV, которые предполагают построить другой компилятор.
любой советует, как это можно сделать (если это вообще можно сделать)?
5 ответов:
С Go 1.5 они, похоже, улучшили процесс кросс-компиляции, то есть теперь он встроен. Нет
./make.bash
-ing илиbrew
- ing требуется. Процесс описан здесь но для TLDR-ers (как я) там: вы просто установитеGOOS
иGOARCH
переменные среды и запустите go build.для еще более ленивых копипастеров (таких как я) там, сделайте что-то вроде этого, если вы находитесь в системе *nix:
env GOOS=linux GOARCH=arm go build -v github.com/path/to/your/app
вы даже узнали
env
трюк, который позволяет устанавливать переменные среды только для этой команды, совершенно бесплатно.
благодаря доброй и терпеливой помощи от golang-орехов, Рецепт следующий:
1) нужно скомпилировать компилятор Go для разных целевых платформ и архитектур. Это делается из папки src в go installation. В моем случае go установка находится в
/usr/local/go
таким образом, чтобы скомпилировать компилятор вам нужно выдатьmake
утилиты. Прежде чем делать это, вы должны знать некоторые предостережения.существует проблема с библиотекой CGO при кросс-компиляции, поэтому ее необходимо отключить Библиотека CGO.
компиляция выполняется путем изменения местоположения на исходный каталог, так как компиляция должна выполняться в этой папке
cd /usr/local/go/src
затем скомпилировать Go compiler:
sudo GOOS=windows GOARCH=386 CGO_ENABLED=0 ./make.bash --no-clean
вам нужно повторить этот шаг для каждой ОС и архитектуры, которую вы хотите скомпилировать, изменив параметры GOOS и GOARCH.
если вы работаете в пользовательском режиме, как и я, sudo необходим, потому что компилятор go находится в системном каталоге, иначе вам нужно войти в систему как суперпользователь. На Mac вам может потребоваться включить / настроить su access (по умолчанию он недоступен), но если вам удалось установить 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 include CGO_ENABLED=0 в командной строке, также обратите внимание, что binaries for linux and mac не имеют расширения, поэтому вы можете добавить расширение ради наличия разных файлов. - o переключатель инструктирует go сделать выходной файл похожим на старые компиляторы для c / C++, таким образом, выше используемого имени приложения.linux может быть любым другим расширением.
если вы используете доморощенного на OS X, то у вас есть простое решение:
$ brew install go --with-cc-common # Linux, Darwin, and Windows
или..
$ brew install go --with-cc-all # All the cross-compilers
использовать
reinstall
Если у вас уже естьgo
установлен.
вы можете сделать это довольно легко с помощью 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
для людей, которые нуждаются CGO включена и кросс-компиляция из таргетинга OSX windows
мне нужно 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
brew install mingw-w64
это, вероятно, установить его здесь
/usr/local/opt/mingw-w64/bin/
.2.Как и другие ответы, нам сначала нужно добавить нашу арку windows в нашу цепочку инструментов компилятора go. Компиляции компилятор нужен компилятор (странное предложение) компиляции компилятор должен идти отдельной встроенных компилятора. Мы можем скачать готовый двоичный файл или сборка из исходного кода в папке, например:
~/Documents/go
теперь мы можем улучшить наш компилятор Go, согласно верхнему ответу, но на этот раз сCGO_ENABLED=1
и наш отдельный встроенный компиляторGOROOT_BOOTSTRAP
(Пуя-это мое имя пользователя):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 файл таргетинга windows с включенным 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