क्रॉस संकलन OSX पर जाएं?


142

मैं विंडोज़ और लिनक्स के लिए बायनेरिज़ बनाने के लिए OSX पर एक गो ऐप को क्रॉस-कंपाइल करने की कोशिश कर रहा हूं। मैंने वह सब कुछ पढ़ा है जो मुझे नेट पर मिल सकता था। निकटतम उदाहरण जो मुझे मिला है, पर प्रकाशित किया गया है (इसके अलावा गो-नट्स मेलिंग सूची पर कई अधूरी चर्चाओं के अलावा):

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

अभी तक यह मेरी स्थापना पर काम नहीं करता है। मैं 1.0.2 गया हूं। जैसा कि 1.0.2 काफी हाल का है, यह मुझे दिखता है कि उपरोक्त सभी उदाहरण इस संस्करण पर लागू नहीं होते हैं।

./make.bash --no-cleanईएनवी वेरिएंट के साथ 386 / विंडोज़ पर सेट करने की कोशिश की , यह बिल्ड गो है, हालांकि यह मेरे इंस्टॉलेशन के लिए जाता है जो darwin/amd64ईएनवी में सेट किया गया है और अलग कंपाइलर बनाने के लिए पूरी तरह से अनदेखा करता है।

कोई सलाह देता है कि यह कैसे किया जा सकता है (यदि यह बिल्कुल किया जा सकता है)?


इसके समानांतर मैंने गोलंग-नट्स मेलिंग सूची पर एक ही प्रश्न पूछा है, और लोगों की दया और धैर्य से अंतिम नुस्खा पकाया गया है ... यह चर्चा धागा है: group.google.com/forum/?fromgroups=# ! विषय / गोलंग-नट /… कई कदम और निष्कर्ष थे, मैं रास्ते में गलत हो गया, लेकिन अब नुस्खा बहुत सरल लगता है - 3 कदम और कुछ पुनरावृत्तियों।
ljgww

अब जब मैं पुनः जा रहा हूं, मैं इस बात से भटक रहा हूं कि ENV var ने सही संकलन को ट्रिगर क्यों नहीं किया - शायद इसलिए कि मैंने किया sudo(संभावना है कि मुझे अलग यूनिक्स ENV मिलेगा जब sudo-ing तो GOOS & GOARCH उपलब्ध नहीं होगा, क्योंकि वे नहीं किए गए हैं इनलाइन)
ljgww

re: jdi - मैं बस अपने "mockup" गो ऐप को मैक / विन बायनेरिज़ पर संकलित करने की कोशिश कर रहा था, लेकिन, ऐसा करने के लिए मुझे प्लेटफ़ॉर्म / प्रोसेसर के प्रत्येक संयोजन के लिए स्वयं जाना होगा। (अभी तक मेरे अपने प्रश्न का उत्तर नहीं दे सकते हैं - यहाँ पर्याप्त प्रतिष्ठा नहीं है)
ljgww

1
क्या आपने उदाहरण में जैसा कहा था, वैसा ही टाइप किया था? CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash- यदि आपने इसे एक से अधिक रेखाओं में विभाजित करने का प्रयास किया है, तो पर्यावरण चर का निर्यात नहीं किया जाएगा जो लक्षणों को फिट करता है
निक क्रेग-वुड

सुनिश्चित करें कि आप मेजबान और लक्ष्य वास्तुकला को भ्रमित नहीं कर रहे हैं। आपको यह आउटपुट देखना चाहिए: "# बिल्डिंग कंपाइलर और गो बूटस्ट्रैप टूल होस्ट, डार्विन / एमड64 के लिए।" "" होस्ट के लिए भवन पैकेज और आदेश, darwin / amd64। " "" बिल्डिंग पैकेज और विंडोज़ / 386 के लिए कमांड। "
सैम

जवाबों:


157

गो 1.5 के साथ उन्हें लगता है कि उन्होंने क्रॉस संकलन प्रक्रिया में सुधार किया है, जिसका अर्थ है कि यह अब बनाया गया है। नो- ./make.bashविंग या brewविंग की आवश्यकता। इस प्रक्रिया का वर्णन यहाँ किया गया है, लेकिन TLDR-ers (मेरे जैसे) के लिए: आप बस GOOSऔर GOARCHपर्यावरण चर सेट करते हैं और गो बिल्ड चलाते हैं।

यहां तक ​​कि वहाँ से बाहर भी lazier कॉपी-पास्टर्स (मेरे जैसे) के लिए, कुछ इस तरह से करें यदि आप एक * nix सिस्टम पर हैं:

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

आपने envचाल भी सीखी , जो आपको केवल उस कमांड के लिए पर्यावरण चर सेट करने देती है, जो पूरी तरह से मुफ्त है।


4
envआदेश रन एक कस्टम वातावरण में ही नहीं कॉल और 'फिर सेट करता है' यह बाद यह किया जाता है। उदाहरण के लिए export GOOS=windows, उसके बाद envऔर echo $GOOSउसके बाद या उसके बिना कमांड । envGOOS के साथ नहीं बदला गया था।
लियोनडेपॉन

3
यह सच है (कम से कम बाश में) बिना env। मैं भागा export GOOS=windowsतो GOOS=linux bash -c 'echo "GOOS: $GOOS"'फिर echo "GOOS: $GOOS"envअन्य शेल बोलियों या अन्य प्लेटफार्मों के साथ अधिक अनुकूलता प्रदान करता है? यदि नहीं तो यहाँ अतिशयोक्ति लगती है।
दाविद्चामर्स 14:13

2
@davidchambers BASH में वे समकक्ष हैं। जबकि कुछ अन्य शेल में, जैसे फिश शेल, यह समर्थन नहीं करता है FOO=bar cmd, इसलिए आपको इसका उपयोग करना होगा env FOO=bar cmd। इस प्रकार मुझे लगता है कि उपयोग करने के लिए सबसे बड़ा लाभ env FOO=bar cmdसंगतता है।
पिकबॉय

1
अविश्वसनीय जवाब यहीं। आपने मेरी समस्या हल कर दी, मुझे एक नई चाल सिखाई, और मुझे अपने आप से गुदगुदाया।
टी ब्लेंक

1
शानदार जवाब, धन्यवाद! Heroku (Intel x86) पर उपयोग के लिए संकलित करने के लिए मैंने लाइन को थोड़ा संशोधित किया env GOOS=linux GOARCH=386 go build -v github.com/path/to/your/appऔर यह एक विजेता की तरह काम करता है
इरा हरमन

136

गोलंग-नट्स से दयालु और रोगी की मदद के लिए धन्यवाद, नुस्खा निम्नलिखित है:

1) विभिन्न लक्ष्य प्लेटफार्मों और आर्किटेक्चर के लिए गो संकलक को संकलित करने की आवश्यकता है। यह स्थापना में src फ़ोल्डर से किया जाता है। मेरे मामले में गो इंस्टॉलेशन /usr/local/goइस प्रकार है कि एक कंपाइलर को संकलित करने के लिए आपको makeउपयोगिता जारी करने की आवश्यकता है । ऐसा करने से पहले आपको कुछ कैविटीज को जानना होगा।

सीजीओ पुस्तकालय के बारे में एक मुद्दा है जब क्रॉस संकलन होता है इसलिए सीजीओ पुस्तकालय को अक्षम करने की आवश्यकता होती है।

संकलन को स्रोत dir में बदलकर किया जाता है, क्योंकि संकलन उस फ़ोल्डर में किया जाना है

cd /usr/local/go/src

फिर गो संकलक को संकलित करें:

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

आपको प्रत्येक OS और आर्किटेक्चर के लिए इस चरण को दोहराना होगा जिसे आप GOOS और GOARCH मापदंडों को बदलकर संकलित करना चाहते हैं।

यदि आप उपयोगकर्ता मोड में काम कर रहे हैं जैसा कि मैं करता हूं, तो sudo की आवश्यकता है क्योंकि Go कंपाइलर सिस्टम dir में है। अन्यथा आपको सुपर उपयोगकर्ता के रूप में लॉग इन करने की आवश्यकता है। मैक पर आपको एसयू एक्सेस को सक्षम / कॉन्फ़िगर करने की आवश्यकता हो सकती है (यह डिफ़ॉल्ट रूप से उपलब्ध नहीं है), लेकिन यदि आप गो स्थापित करने में कामयाब रहे हैं तो संभवतः आपके पास पहले से ही रूट एक्सेस है।

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 के साथ समस्याओं का सामना करते हैं तो कमांड लाइन में CGO_ENABLED = 0 शामिल करें। यह भी ध्यान दें कि लिनक्स और मैक के लिए बायनेरिज़ का कोई विस्तार नहीं है, इसलिए आप अलग-अलग फ़ाइलों के लिए एक्सटेंशन जोड़ सकते हैं। -o स्विच का निर्देश c / c ++ के लिए पुराने कंपाइलरों के समान आउटपुट फाइल बनाने के लिए जाएं। इस प्रकार उपयोग किए गए appname.linux से ऊपर कोई अन्य एक्सटेंशन हो सकता है।


शुरू में मुझे जो उलझन हुई, वह यह है कि संकलन के पहले भाग में कहा गया है: # Building compilers and Go bootstrap tool for host, darwin/amd64लेकिन बाद में यह वास्तव में समाप्त हो जाता है: --- Installed Go for windows/386 in /usr/local/go Installed commands in /usr/local/go/binइसलिए कंपाइलर को संकलित करने के बजाय समाप्त होने का अवलोकन करना चाहिए।
ljgww

सब कुछ करने की कोशिश करके शुरू किया: $ GOARCH=386 GOOS=linux go build app.goऔर त्रुटि हो रही है # 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
होमब्रे में गो के पैकेज में एक विकल्प "- क्रोस-कंपाइल-ऑल" है जो स्वचालित रूप से सभी क्रॉस कंपाइलरों का निर्माण करेगा।
19

8
महान टिप @nimrodm! आपका प्रिय स्थापना पुन: संयोजित करने के लिए है, तो आप को चलाने के लिए की जरूरत हैbrew reinstall go --cross-compile-all
Linqu

1
@ljgww 'sudo' में ENV कॉन्फ़िगर नहीं है। मैं / usr / लोकल / गो / pkg / linux_amd64 /
नूनो सिल्वा

63

यदि आप OS X पर Homebrew का उपयोग करते हैं , तो आपके पास एक सरल उपाय है:

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

या ..

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

reinstallयदि आपने पहले ही goस्थापित कर लिया है तो उपयोग करें ।


3
अद्यतन किए गए स्विच हैं: --cross-compile-all सभी समर्थित प्लेटफार्मों के लिए क्रॉस-कंपाइलर और रनटाइम समर्थन का निर्माण करें-cross-compile-common, डार्विन, लिनक्स और विंडोज़ के लिए क्रॉस-कंपाइलर्स और रनटाइम समर्थन बनाएँ
चिप टोल

3
--cross-compile-allअब है--with-cc-all
जियानबाओ

@ sheeks06 - फिक्स्ड। धन्यवाद!
15'15 बजे docwhat

1
ये झंडे अब मौजूद नहीं हैं जो मैं बता सकता हूं। एकमात्र प्रासंगिक विकल्प जो मैं देख रहा हूं वह है --woutout-cgo :(
rdegges

5
गो 1.5 के बाद से, कोई अलग क्रॉस-कंपाइलर नहीं हैं, आप केवल झंडे का उपयोग करते हैं अब tip.golang.org/doc/go1.5#compiler_and_tools
chuckus

24

आप डॉकटर का उपयोग करके यह बहुत आसानी से कर सकते हैं, इसलिए कोई अतिरिक्त देयता की आवश्यकता नहीं है। बस इस कमांड को चलाएं:

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-use-docker-beaa102a316d


1
कोई भी डॉकटर को यह करने के लिए क्यों स्थापित करना चाहेगा जब वे सिर्फ एक शेल लूप कर सकते हैं env GOOS=x GOARCH=y go install something/...और नीचे उपयुक्त बायनेरिज़ के साथ समाप्त हो सकते हैं $GOPATH/bin/$GOOS_$GOARCH?? और बीटीडब्लू, गो आपको सूचीबद्ध तीन ओएस से अधिक का समर्थन करता है, बीएसडी के लिए कोई प्यार क्यों?
डेव सी

8
आप ऐसा करने के लिए सिर्फ डॉकर स्थापित नहीं करेंगे, लेकिन अगर आपके पास यह है, तो यह विकल्पों की तुलना में आसान और क्लीनर है।
ट्रैविस रीडर

7

कई प्लेटफार्मों के लिए निष्पादनयोग्य बनाने की प्रक्रिया थोड़ी थकाऊ हो सकती है, इसलिए मैं एक स्क्रिप्ट का उपयोग करने का सुझाव देता हूं:

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

मैंने इस स्क्रिप्ट को OSX पर ही चेक किया

gist - go-executable-build.sh


वास्तव में मैं क्या देख रहा था ... मैंने इसे डॉक्यूमेंट किया है :) gist.github.com/marcellodesales/…
Marcello de Sales

6

उन लोगों के लिए जिन्हें सीजीओ सक्षम होना चाहिए और ओएसएक्स लक्ष्यीकरण खिड़कियों से संकलित पार करना चाहिए

मुझे अपने मैक से खिड़कियों के लिए संकलन करते समय सीजीओ सक्षम होना चाहिए क्योंकि मैंने 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. हम एक CGO निर्भर पुस्तकालय के साथ खिड़कियों के लिए संकलन पार करने जा रहे हैं। पहले हमें एक क्रॉस कंपाइलर की तरह स्थापित होना चाहिएmingw-w64

brew install mingw-w64

यह शायद इसे यहां स्थापित करेगा /usr/local/opt/mingw-w64/bin/

2.जैसे अन्य उत्तरों की तरह, हमें पहले अपने विंडोज आर्क को हमारे गो कंपाइलर टूलकिन में जोड़ना होगा। कंपाइलर को संकलित करने के लिए कंपाइलर (अजीब वाक्य) की जरूरत होती है, कंपाइलर गो कंपाइलर के लिए अलग प्री-बिल्ट कंपाइलर की जरूरत होती है। हम एक प्री -बिल्ट बाइनरी डाउनलोड कर सकते हैं या किसी फ़ोल्डर में स्रोत से निर्माण ~/Documents/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.अब हमारे गो कोड के उपयोग mingwको संकलित करते हुए हमारी गो फाइल लक्ष्यित खिड़कियों को सीजीओ सक्षम के साथ संकलित करें:

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.