Estou tentando compilar um aplicativo go no OSX para criar binários para Windows e Linux. Eu li tudo o que pude encontrar na net. O exemplo mais próximo que encontrei foi publicado (além de muitas discussões inacabadas na lista de discussão maluca):
http://solovyov.net/en/2012/03/09/cross-compiling-go/
ainda não funciona na minha instalação. Eu tenho 1.0.2. Como a 1.0.2 é bastante recente, parece-me que todos os exemplos acima não se aplicam a esta versão.
Tentado fazer ./make.bash --no-clean
com vars ENV definido como 386 / windows, ele cria go, no entanto, ele cria para minha instalação que é darwin/amd64
e ignora completamente o que é definido em ENV que supõe a criação de compilador diferente.
Alguém aconselha como isso pode ser feito (se é que pode ser feito)?
fonte
sudo
(provavelmente obteria ENV unix diferente ao fazer o sudo, para que o GOOS & GOARCH não estivesse disponível se não terminassem Inline)CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash
- se você tentou dividi-lo em mais de uma linha, em seguida, a variável de ambiente não serão exportados que se encaixa os sintomasRespostas:
Com o Go 1.5, eles parecem ter melhorado o processo de compilação cruzada, o que significa que ele está incorporado agora. Nenhum
./make.bash
-ing oubrew
-ing necessário. O processo é descrito aqui , mas para os TLDR-ers (como eu) lá fora: você acabou de definir osGOOS
e asGOARCH
variáveis de ambiente e executar a construção movimento.Para os usuários mais preguiçosos (como eu) por aí, faça algo assim se estiver em um sistema * nix:
Você até aprendeu o
env
truque, que permite definir variáveis de ambiente apenas para esse comando, completamente grátis.fonte
env
comando executa apenas essa chamada em um ambiente personalizado e a 'redefine' após a conclusão. Por exemplo runexport GOOS=windows
, então o comando com ou sem aenv
eecho $GOOS
depois. Com oenv
GOOS não foi alterado.env
. Eu corriexport GOOS=windows
entãoGOOS=linux bash -c 'echo "GOOS: $GOOS"'
entãoecho "GOOS: $GOOS"
. Ofereceenv
maior compatibilidade com outros dialetos de shell ou com outras plataformas? Se não, parece supérfluo aqui.FOO=bar cmd
, então você precisa usá-loenv FOO=bar cmd
. Portanto, acho que a maior vantagem a ser usadaenv FOO=bar cmd
é a compatibilidade.env GOOS=linux GOARCH=386 go build -v github.com/path/to/your/app
e funciona como um campeãoGraças à ajuda gentil e paciente das nozes golang, a receita é a seguinte:
1) É necessário compilar o compilador Go para diferentes plataformas e arquiteturas de destino. Isso é feito na pasta src na instalação go. No meu caso, a instalação do Go está localizada
/usr/local/go
assim, para compilar um compilador, você precisa emitir omake
utilitário. Antes de fazer isso, você precisa conhecer algumas advertências.Há um problema na biblioteca CGO durante a compilação cruzada, portanto, é necessário desativar a biblioteca CGO.
A compilação é feita alterando o local para o diretório de origem, pois a compilação deve ser feita nessa pasta
então compile o compilador Go:
Você precisa repetir esta etapa para cada SO e arquitetura que deseja cruzar a compilação, alterando os parâmetros GOOS e GOARCH.
Se você estiver trabalhando no modo de usuário como eu, o sudo será necessário porque o compilador Go está no diretório do sistema. Caso contrário, você precisa estar logado como superusuário. No Mac, pode ser necessário ativar / configurar o acesso da SU (por padrão, não está disponível), mas se você conseguiu instalar o Go, provavelmente já possui acesso root.
2) Depois de criar todos os compiladores cruzados, você poderá compilar com facilidade seu aplicativo usando as seguintes configurações, por exemplo:
Altere GOOS e GOARCH para os alvos que você deseja criar.
Se você encontrar problemas com o CGO, inclua CGO_ENABLED = 0 na linha de comandos. Observe também que os binários para linux e mac não têm extensão; portanto, você pode adicioná-la para ter arquivos diferentes. -o switch instrui o Go para tornar o arquivo de saída semelhante aos antigos compiladores para c / c ++, portanto acima do appname.linux usado pode ser qualquer outra extensão.
fonte
# Building compilers and Go bootstrap tool for host, darwin/amd64
mas mais tarde, na verdade, acaba como:--- Installed Go for windows/386 in /usr/local/go Installed commands in /usr/local/go/bin
então devemos observar o final, em vez de começar a compilar o compilador.$ GOARCH=386 GOOS=linux go build app.go
e recebendo erro# 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
Se você usa o Homebrew no OS X, tem uma solução mais simples:
ou..
Use
reinstall
se você já tivergo
instalado.fonte
--cross-compile-all
é agora--with-cc-all
Você pode fazer isso facilmente usando o Docker, portanto, não são necessárias bibliotecas extras. Basta executar este comando:
Você pode encontrar mais detalhes neste post: https://medium.com/iron-io-blog/how-to-cross-compile-go-programs-using-docker-beaa102a316d
fonte
env GOOS=x GOARCH=y go install something/...
e terminar com os binários apropriados em$GOPATH/bin/$GOOS_$GOARCH
?? E, BTW, Go suporta mais do que os três sistemas operacionais listados, por que não ama os BSDs?O processo de criação de executáveis para muitas plataformas pode ser um pouco entediante, então sugiro usar um script:
Eu verifiquei este script apenas no OSX
gist - go-executable-build.sh
fonte
Eu precisava do CGO ativado durante a compilação do Windows para o Windows desde que havia importado o https://github.com/mattn/go-sqlite3 e ele precisava. Compilar de acordo com outras respostas me deu um erro:
Se você é como eu e precisa compilar com o CGO. Isto é o que eu fiz:
1.Nós vamos cruzar a compilação para janelas com uma biblioteca dependente de CGO. Primeiro, precisamos de um compilador cruzado instalado como
mingw-w64
Isso provavelmente o instalará aqui
/usr/local/opt/mingw-w64/bin/
.2.Como outras respostas, primeiro precisamos adicionar nosso arco do Windows à nossa cadeia de ferramentas do compilador go agora. Compilar um compilador precisa de um compilador (sentença estranha). O compilador go precisa de um compilador pré-compilado separado. Podemos fazer o download de um binário pré-construído ou compilar a partir do código-fonte em uma pasta, por exemplo:
~/Documents/go
agora podemos melhorar nosso compilador Go, de acordo com a resposta principal, mas desta vez comCGO_ENABLED=1
nosso compilador pré-construído separadoGOROOT_BOOTSTRAP
(Pooya é meu nome de usuário):Agora, ao compilar nosso código Go, use-o
mingw
para compilar nossas janelas de segmentação de arquivos go com o CGO ativado:fonte