Çapraz derleme OSX'te devam edilsin mi?


142

Windows ve linux için ikili dosyalar oluşturmak için OSX'te bir go uygulamasını çapraz derlemeye çalışıyorum. İnternette bulabildiğim her şeyi okudum. Bulduğum en yakın örnek yayınlandı (go-nut posta listesinde bitmemiş birçok tartışma dışında):

http://solovyov.net/en/2012/03/09/cross-compiling-go/

yine de benim kurulum üzerinde çalışmıyor. 1.0.2'ye girdim. 1.0.2 oldukça yeni olduğu için yukarıdaki örneklerin hepsi bu versiyon için geçerli değildir.

Yapmaya çalıştı ./make.bash --no-cleanENV 386 / pencere ayarlı vars ile, bu yapı gitmesine yapar ancak benim kurulumu için gitmek oluşturur darwin/amd64ve tamamen varsayalım farklı derleyici oluşturmak için bu ENV ayarlanır neyi göz ardı eder.

Herhangi biri nasıl yapılabilir (hiç yapılabilirse)?


buna paralel ben golang-fındık posta listesinde aynı soruyu sordum, ve orada insanların tür yardım ve sabır ile nihai tarifi pişmiş var ... bu tartışma konu: groups.google.com/forum/?fromgroups=# ! topic / golang-nuts /… birkaç adım ve sonuç vardı, yolda yanlış yaptım, ama şimdi tarif oldukça basit görünüyor - 3 adım ve bazı iterasyonlar.
ljgww

Şimdi tekrar ediyorum, ENV değişkenlerinin neden doğru derlemeyi tetiklemediğine dair dolaşıyorum - belki de yaptım sudo(sudo-in sırasında muhtemelen farklı unix ENV alacağım, böylece GOOS & GOARCH yapılmazsa mevcut olmayacaktı inline)
ljgww

re: jdi - Ben sadece benim "mockup" gitmek app mac / lin ikili kazanmak için derlemeye çalışıyordu, ama bunu yapmak için platform / işlemci her kombinasyonu için kendini gitmek zorunda kaldı. (henüz kendi soruma cevap
veremiyorum

1
Örnekte söylediklerini tam olarak yazdınız mı? CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash- birden fazla satıra bölmeye çalışırsanız, belirtilere uyan ortam değişkeni dışa aktarılmaz
Nick Craig-Wood

Ana makine ve hedef mimariyi karıştırmamaya dikkat edin. Şu çıktıyı görmelisiniz: "# Derleyici oluşturma ve ana bilgisayar için git bootstrap aracı, darwin / amd64." "# Host, darwin / amd64 için paketler ve komutlar oluşturma." "# Windows için paketler ve komutlar oluşturma / 386."
Sam

Yanıtlar:


157

Go 1.5 ile çapraz derleme sürecini geliştirmiş gibi görünüyorlar, yani şu an yerleşiktir. Hiçbir ./make.bash-ing veya brewgerekli -ing. Süreç burada açıklanır ancak TLDR-ers (benim gibi) için: sadece GOOSve GOARCHortam değişkenlerini ayarlayıp go build'i çalıştırırsınız.

Daha tembel kopyalayıcılar (benim gibi) için, bir * nix sistemindeyseniz böyle bir şey yapın:

env GOOS=linux GOARCH=arm go build -v github.com/path/to/your/app

Sadece envbu komut için ortam değişkenlerini tamamen ücretsiz olarak ayarlamanıza izin veren hileyi bile öğrendiniz .


4
envKomutu çalıştırır sadece bu özel ortamda çağrı ve bu yapılır onu sonra 'sıfırlar'. Örneğin run export GOOS=windows, sonra envve echo $GOOSsonra ve sonra komut . İle envGOOS değiştirilmedi.
leondepeon

3
Aynı şey (en azından Bash'te) olmadan da geçerlidir env. Sonra koştum export GOOS=windowso GOOS=linux bash -c 'echo "GOOS: $GOOS"'zaman echo "GOOS: $GOOS". envDiğer kabuk ağızları veya diğer platformlarla daha fazla uyumluluk sağlıyor mu ? Değilse burada gereksiz görünüyor.
davidchambers

2
@davidchambers BASH'de eşdeğerdirler. Başka bir Kabukta, örneğin FISH kabuğundayken, desteklemez FOO=bar cmd, bu yüzden kullanmanız gerekir env FOO=bar cmd. Bu yüzden kullanmanın en büyük avantajının env FOO=bar cmduyumluluk olduğunu düşünüyorum .
PickBoy

1
Burada inanılmaz bir cevap. Sorunumu çözdün, bana yeni bir numara öğrettin ve kendime kıkırdadın.
T Blank

1
Harika cevap, teşekkürler! Heroku (intel x86) üzerinde kullanmak için derlemeyi biraz değiştirdim env GOOS=linux GOARCH=386 go build -v github.com/path/to/your/appve şampiyon gibi çalışıyor
Ira Herman

136

Golang fıstıklarından gelen nazik ve hasta yardımı sayesinde, tarif aşağıdaki gibidir:

1) Farklı hedef platformlar ve mimariler için Go derleyicisini derlemek gerekir. Bu, go kurulumundaki src klasöründen yapılır. Benim durumumda Go kurulum /usr/local/goböylece bir derleyici derlemek için bulunan makeyardımcı programı gerekir gerekir . Bunu yapmadan önce bazı uyarıları bilmeniz gerekir.

Çapraz derleme sırasında CGO kitaplığı ile ilgili bir sorun var, bu nedenle CGO kitaplığını devre dışı bırakmak gerekiyor.

Derleme o klasörde konum değiştirilerek yapılır, çünkü derleme bu klasörde yapılmalıdır

cd /usr/local/go/src

sonra Go derleyicisini derleyin:

sudo GOOS=windows GOARCH=386 CGO_ENABLED=0 ./make.bash --no-clean

GOOS ve GOARCH parametrelerini değiştirerek derlemek istediğiniz her işletim sistemi ve mimari için bu adımı tekrarlamanız gerekir.

Benim gibi kullanıcı modunda çalışıyorsanız, Go derleyicisi sistem dizininde olduğu için sudo gereklidir. Aksi takdirde süper kullanıcı olarak oturum açmanız gerekir. Mac'te SU erişimini etkinleştirmeniz / yapılandırmanız gerekebilir (varsayılan olarak mevcut değildir), ancak Go'yu yüklemeyi başardıysanız muhtemelen kök erişiminiz vardır.

2) Tüm çapraz derleyiciler oluşturulduktan sonra, örneğin aşağıdaki ayarları kullanarak uygulamanızı çapraz olarak mutlu bir şekilde derleyebilirsiniz:

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 ve GOARCH'ı oluşturmak istediğiniz hedeflerle değiştirin.

CGO ile ilgili sorunlarla karşılaşırsanız, komut satırına CGO_ENABLED = 0 ekleyin. Ayrıca linux ve mac ikili dosyalarının uzantı içermediğini unutmayın, bu nedenle farklı dosyalara sahip olmak için uzantı ekleyebilirsiniz. -o anahtarı c / c ++ için eski derleyicilere benzer çıktı dosyası yapmayı söyler, bu nedenle yukarıda kullanılan appname.linux başka bir uzantı olabilir.


Başlangıçta beni şaşırtan şey, derlemenin ilk bölümünde şunu söylüyor: # Building compilers and Go bootstrap tool for host, darwin/amd64ama daha sonra aslında şu şekilde sonuçlanıyor: --- Installed Go for windows/386 in /usr/local/go Installed commands in /usr/local/go/binyani derleyiciyi derlemeye başlamaktan ziyade sonunu gözlemleyecek.
ljgww

her şey yapmaya çalışarak başladı: $ GOARCH=386 GOOS=linux go build app.gove hata alıyorum # 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
ljgww

30
Go'nun Homebrew'daki paketi otomatik olarak tüm çapraz derleyicileri oluşturacak "--cross-compile-all" seçeneğine sahiptir.
nimrodm

8
büyük ipucu @ nimrodm! kurulumunuzu yeniden derlemek için çalıştırmanız gerekirbrew reinstall go --cross-compile-all
linqu

1
@ljgww 'sudo' yapılandırılmış ENV'ye sahip değil. / Usr / local / go / pkg / linux_amd64 /
Nuno Silva

63

OS X'te Homebrew kullanıyorsanız , daha basit bir çözümünüz var:

$ brew install go --with-cc-common # Linux, Darwin, and Windows

veya..

$ brew install go --with-cc-all # All the cross-compilers

reinstallÖnceden goyüklediyseniz kullanın .


3
Güncellenen anahtarlara dikkat edin: --cross-compile-all Desteklenen tüm platformlar için çapraz derleyiciler ve çalışma zamanı desteği oluşturun --cross-compile-common Darwin, linux ve windows için çapraz derleyiciler ve çalışma zamanı desteği oluşturun
Chip Tol

3
--cross-compile-allşimdi--with-cc-all
gianebao

@ sheeks06 - düzeltildi. Teşekkürler!
docwhat

1
Bu bayraklar artık söyleyebileceğimden yok. Gördüğüm tek alakalı seçenek --without-cgo :(
rdegges

5
Go 1.5'ten bu yana, ayrı bir çapraz derleyici yoktur, şimdi yalnızca bayrakları kullanıyorsunuz. Tip.golang.org/doc/go1.5#compiler_and_tools
chuckus

24

Docker'ı kullanarak bunu kolayca yapabilirsiniz, böylece ekstra kütüphaneye gerek yoktur. Sadece şu komutu çalıştırın:

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
'

Bu yayında daha fazla ayrıntı bulabilirsiniz: https://medium.com/iron-io-blog/how-to-cross-compile-go-programs-using-docker-beaa102a316d


1
Neden herkes sadece bir kabuk döngü yapmak env GOOS=x GOARCH=y go install something/...ve altında uygun ikili ile sona erdi Docker yüklemek istesin $GOPATH/bin/$GOOS_$GOARCH? BTW, Go, listelediğiniz üç işletim sisteminden fazlasını destekler, neden BSD'lere sevginiz yok?
Dave C

8
Docker'ı sadece bunu yapmak için yüklemezsiniz, ancak elinizde varsa, bu alternatiflerden daha kolay ve temizdir.
Travis Reeder

7

Birçok platform için yürütülebilir dosyalar oluşturma işlemi biraz sıkıcı olabilir, bu yüzden bir komut dosyası kullanmanızı öneririz:

#!/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

Bu komut dosyasını yalnızca OSX'te kontrol ettim

gist - go-executable-build.sh


Tam aradığım şey ... Dockerized it :) :) gist.github.com/marcellodesales/…
Marcello de Sales

6

CGO özellikli ve OSX hedefleme pencerelerinden çapraz derleme gerektiren kişiler için

Https://github.com/mattn/go-sqlite3 dosyasını içe aktardığım için mac'umdan pencereler derlerken CGO'nun etkinleştirilmesine ihtiyacım vardı ve buna ihtiyaç duyuyordu. Diğer cevaplara göre derlemek bana hata verdi:

/usr/local/go/src/runtime/cgo/gcc_windows_amd64.c:8:10: fatal error: 'windows.h' file not found

Benim gibiyseniz ve CGO ile derlemeniz gerekiyorsa. Ben de öyle yaptım:

1.Bir CGO bağımlı kütüphanesi olan pencereler için derlemeyi geçeceğiz. Öncelikle bir çapraz derleyiciye ihtiyacımız varmingw-w64

brew install mingw-w64

Bu muhtemelen buraya kuracaktır /usr/local/opt/mingw-w64/bin/ .

2.Sadece diğer cevaplar gibi, ilk önce Windows arşivimizi go derleyici araç zincirimize eklememiz gerekiyor. Bir derleyicinin derlenmesi için bir derleyici (garip cümle) gerekir, derleyicinin derlenmesi için önceden hazırlanmış ayrı bir derleyici gerekir. Önceden oluşturulmuş bir ikili dosyayı indirebilir veya bir klasördeki kaynaktan kaynak oluşturabiliriz: örneğin ~/Documents/go , en iyi cevaba göre Go derleyicimizi geliştirebiliriz, ancak bu sefer CGO_ENABLED=1ve önceden oluşturulmuş ayrı derleyicimizle GOROOT_BOOTSTRAP(Pooya benim kullanıcı adım):

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.Şimdi Go kodumuzu derlerken mingw, CGO etkinken go dosya hedefleme pencerelerimizi derlemek için kullanın :

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.