Кросс-компиляция идет на 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 115

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