web-dev-qa-db-fra.com

Comment croiser la compilation de Windows vers Linux?

J'ai installé Go 1.2 sur une machine Windows, rédigé un programme factice et défini les variables d'environnement GOARCH et GOOS sur "AMD64" et "linux" respectivement.

Lorsque j'émets le "go build "commande, je reçois une erreur:

go build runtime: linux/AMD64 must be bootstrapped using make.bat

Qu'est-ce que ça veut dire?

26
Dante

Il vous indique qu'il a besoin de tous les outils créés avant de pouvoir les utiliser.

Si votre GOARCH Windows est AMD64, vous pouvez "construire" tous les outils nécessaires en exécutant ces petits programmes batch:

set GOARCH=AMD64
set GOOS=linux
go tool dist install -v pkg/runtime
go install -v -a std

Si cela réussit, vous devriez pouvoir faire ce que vous avez décrit (utilisez simplement AMD64, pas AMD64 - il est sensible à la casse).

Si votre fenêtre GOARCH est 386, vous devez d'abord créer vos outils 386. Vous auriez besoin de télécharger mingw gcc pour cela. Faites ce que user2714852 a dit.

Ici https://golang.org/wiki/WindowsCrossCompiling sont des instructions similaires pour Linux, peut-être les trouvez-vous utiles.

Alex

37
alex

Pour définir l'utilisation des variables d'environnement PowerShell (aucun mode administrateur requis):
$env:GOOS = "linux"
Que de construire votre programme go build

La variable d'environnement modifiée n'est valable que dans la fenêtre PowerShell actuelle. Tout sera réinitialisé lorsque vous rouvrirez la fenêtre.

12
eDdA

J'avais des problèmes majeurs avec la construction de Linux à partir de Windows, à la fin de la journée, c'était assez simple. Je voudrais commenter le post d'Alex, mais je ne peux pas car je suis un newb stackoverflow.

Comme l'a dit Alex, définissez les variables d'environnement . Ceci doit être effectué en tant qu'administrateur (par exemple, cliquez avec le bouton droit sur le raccourci "Invite de commandes" ou "PowerShell" et cliquez sur "Exécuter en tant qu'administrateur")

set GOARCH=AMD64
set GOOS=linux

Si vous ne le faites pas en tant qu'administrateur, les variables ne prendront pas effet et vous le construirez simplement pour le système d'exploitation et l'architecture sur lesquels vous vous trouvez actuellement.

J'ai trouvé qu'il est toujours bon de vérifier vos variables d'environnement go en exécutant go env, qui vous donne la liste des variables d'environnement go actuelles

go env
set GOARCH=AMD64
set GOBIN=
set GOEXE=
set GOHOSTARCH=AMD64
set GOHOSTOS=windows
set GOOS=linux
set GOPATH=T:\Projects\gopath
set GORACE=
set GOROOT=C:\Go
set GOTOOLDIR=C:\Go\pkg\tool\windows_AMD64
set GCCGO=gccgo
set CC=gcc
set GOGCCFLAGS=-fPIC -m64 -fmessage-length=0
set CXX=g++
set CGO_ENABLED=0
set PKG_CONFIG=pkg-config
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2

Assurez-vous que GOOS & GOARCH sont définis sur les valeurs que vous avez spécifiées précédemment.

Si c'est tout bon, vous devriez pouvoir naviguer vers le répertoire contenant votre code go, et à partir de la ligne de commande exécuter:

go build

Qui va construire le package pour le système et l'architecture qui sont définis dans les variables d'environnement.
J'ai rencontré d'autres problèmes une fois que j'ai finalement compris cela, mais c'est une autre question sans rapport avec ce problème.

11
David O

Pour effectuer une compilation croisée de Go, vous devez d'abord pouvoir construire Go à partir du code source. Pour ce faire, il semble que vous devez installer MinGW pour obtenir gcc et d'autres outils. L'aide à ce sujet est à https://code.google.com/p/go-wiki/wiki/WindowsBuild .

À partir de là, voici comment ça se passe si c'est comme la compilation croisée Linux:

D'abord cd à votre go\src répertoire. Si vous ne savez pas où cela se trouve, tapez go env et vous verrez une ligne comme GOROOT="\some\dir\" dans la sortie; fais juste cd \some\dir\src\

Ensuite, avec GOOS=linux et GOARCH=AMD64 définir, saisir .\make.bat, qui va construire une version du compilateur Go, etc. ciblant Linux. Ensuite, vous ne devriez plus obtenir cette erreur.

1
twotwotwo