ক্রস সংকলন OSX এ যান?


142

আমি উইন্ডোজ এবং লিনাক্সের বাইনারিগুলি তৈরি করতে ওএসএক্স-এ একটি গো অ্যাপ ক্রস-সংকলন করার চেষ্টা করছি। আমি নেট থেকে যা খুজে পেয়েছি তা সবই পড়েছি। আমার সন্ধানের সবচেয়ে কাছের উদাহরণটি প্রকাশিত হয়েছে (গো-বাদামের মেলিং তালিকার অনেক অসম্পূর্ণ আলোচনা বাদে):

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

তবুও এটি আমার ইনস্টলেশনতে কাজ করে না। আমি গেছি 1.0.2। 1.0.2 হিসাবে সাম্প্রতিকতম এটি আমার কাছে মনে হয় যে উপরের সমস্ত উদাহরণগুলি এই সংস্করণে প্রযোজ্য নয়।

./make.bash --no-cleanENV vars 386 / উইন্ডোতে সেট করার চেষ্টা করে , এটি বিল্ড গো যায় না, তবে এটি আমার ইনস্টলেশনটি তৈরি করে যা darwin/amd64পুরোপুরি ENV- তে সেট করা আছে যা উপেক্ষা করে এবং বিভিন্ন সংকলক তৈরির কথা মনে করে completely

কীভাবে এটি করা যায় (কেউ যদি এটি আদৌ করা যায়) তবে কেউ পরামর্শ দেয়?


এর সমান্তরাল আমি গোলং-বাদামের মেলিং তালিকায় একই প্রশ্নটি জিজ্ঞাসা করেছি, এবং সেখানে মানুষের ধৈর্য সহকারে এবং ধৈর্য নিয়ে চূড়ান্ত রেসিপিটি রান্না হয়ে গেছে ... এটিই আলোচনার সূত্র: গ্রুপ. google.com/forum/?fromgroups=# টপিক / গোলং-বাদাম /… বেশ কয়েকটি পদক্ষেপ এবং উপসংহার ছিল, পথে আমি ভুল হয়ে গেলাম, তবে এখন রেসিপিটি বেশ সহজ - 3 টি ধাপ এবং কিছু পুনরাবৃত্তি।
ljgww

এখন যেহেতু আমি পুনরুদ্ধার করতে যাচ্ছি, আমি কেন ঘোরাফেরা করলাম কেন ENV vars সঠিক সংকলনটি ট্রিগার করল না - সম্ভবত কারণ আমি করেছি sudo(সম্ভবত আমি sudo-ing করার সময় বিভিন্ন ইউনিক্স ENV পেয়ে যাব যদি সেগুলি না করা হয় তবে GOOS এবং GOARCH পাওয়া যায় না) ইনলাইন)
ljgww

পুনরায়: জেডি - আমি কেবল ম্যাকের উপর লিন বাইনারি জিততে আমার "মকআপ" গো অ্যাপটি সংকলন করার চেষ্টা করছিলাম, তবে এটি করার জন্য আমাকে প্ল্যাটফর্ম / প্রসেসরের প্রতিটি সংমিশ্রনের জন্য নিজেই তৈরি করতে হয়েছিল। (এখানে পর্যাপ্ত খ্যাতি নেই - এখনও আমার নিজের প্রশ্নের উত্তর দিতে পারছে না)
ljgww

1
আপনি উদাহরণটিতে যা বলেছেন ঠিক তেমন টাইপ করেছেন? CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash- যদি আপনি এটিকে একাধিক লাইনে বিভক্ত করার চেষ্টা করেন তবে পরিবেশের পরিবর্তনশীল রফতানি হবে না যা লক্ষণগুলির সাথে খাপ খায়
নিক ক্রেগ-উড

নিশ্চিত হন যে আপনি হোস্ট এবং টার্গেট আর্কিটেকচারকে বিভ্রান্ত করছেন না। আপনার এই আউটপুটটি দেখতে হবে: "# হোস্ট, ডারউইন / এএমডি 64 এর জন্য বিল্ডিং সংকলক এবং গো বুটস্ট্র্যাপ সরঞ্জাম।" "# হোস্ট, ডারউইন / এএমডি 64 এর জন্য প্যাকেজ এবং কমান্ড নির্মাণ করছে" " "# উইন্ডোজ / 386 এর জন্য প্যাকেজগুলি এবং কমান্ডগুলি বিল্ডিং।"
সাম

উত্তর:


157

Go 1.5 এর সাথে তারা ক্রস সংকলন প্রক্রিয়াটি উন্নত করেছে বলে মনে হচ্ছে, এটি এখনই নির্মিত। নো- ./make.bashবিং বা brew-িং প্রয়োজন নেই। প্রক্রিয়াটি এখানে বর্ণিত হয়েছে তবে টিএলডিআর-এরগুলির জন্য (আমার মতো) সেখানে রয়েছে: আপনি কেবল GOOSএবং GOARCHপরিবেশের ভেরিয়েবলগুলি সেট করেছেন এবং গো বিল্ডটি চালান।

এমনকি অলস অনুলিপি-প্যাষ্টারদের জন্য (আমার মতো), আপনি যদি * নিক্স সিস্টেমে থাকেন তবে এই জাতীয় কিছু করুন:

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অন্যান্য শেল ডায়ালিকের সাথে বা অন্যান্য প্ল্যাটফর্মগুলির সাথে কি আরও বেশি সামঞ্জস্যতা সরবরাহ করে? যদি তা এখানে অতিরিক্ত প্রয়োজন মনে হয়।
ডেভিডচাম্বার

2
@ ডেভিডচামার্স বেস এ তারা সমতুল্য। অন্য কোনও শেলের মধ্যে যেমন, FISH শেল, এটি সমর্থন করে না FOO=bar cmd, তাই আপনাকে ব্যবহার করতে হবে env FOO=bar cmd। সুতরাং আমি মনে করি ব্যবহারের সবচেয়ে বড় সুবিধাটি env FOO=bar cmdসামঞ্জস্যতা।
পিকবয়

1
ঠিক এখানে অবিশ্বাস্য উত্তর। আপনি আমার সমস্যা সমাধান করেছেন, আমাকে একটি নতুন কৌশল শিখিয়েছেন এবং আমাকে নিজের কাছে বকাবকি করেছেন।
টি ফাঁকা

1
দুর্দান্ত উত্তর, আপনাকে ধন্যবাদ! হিরকুতে ব্যবহারের জন্য সংকলন করার জন্য (ইন্টেল x86) আমি লাইনটি সামান্য পরিবর্তন করেছি env GOOS=linux GOARCH=386 go build -v github.com/path/to/your/appএবং এটি চ্যাম্পের মতো কাজ করে
ইরা হারমান

136

গোলং-বাদাম থেকে দয়ালু এবং রোগীর সহায়তার জন্য ধন্যবাদ, রেসিপিটি নিম্নলিখিত:

1) একটিকে বিভিন্ন টার্গেট প্ল্যাটফর্ম এবং আর্কিটেকচারের জন্য গো সংকলক তৈরি করতে হবে। এটি গো ইনস্টলেশনে এসসিআর ফোল্ডার থেকে করা হয়। আমার ক্ষেত্রে গো ইনস্টলেশনটি /usr/local/goএকটি makeইউটিলিটি ইস্যু করতে হবে এমন একটি সংকলক সংকলন করতে এইভাবে অবস্থিত । এটি করার আগে আপনাকে কিছু সতর্কতা সম্পর্কে জানতে হবে।

ক্রস সংকলন করার সময় সিজিও গ্রন্থাগার সম্পর্কে একটি সমস্যা রয়েছে তাই এটি সিজিও লাইব্রেরিটি অক্ষম করার প্রয়োজন।

সংকলনটি সেই স্থানে সোর্স ডিয়ারে পরিবর্তন করে সম্পন্ন করা হয়, যেহেতু সেই ফোল্ডারে সংকলন করতে হয়

cd /usr/local/go/src

তারপরে গো সংকলকটি সংকলন করুন:

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

আপনি প্রতিটি ওএস এবং আর্কিটেকচারের জন্য জিওওএস এবং গৌড় পরামিতি পরিবর্তন করে সংকলনটি অতিক্রম করতে চান তার জন্য আপনাকে এই পদক্ষেপটি পুনরাবৃত্তি করতে হবে।

আমার মতো আপনি যদি ইউজার মোডে কাজ করছেন তবে সুডোর প্রয়োজন কারণ গো কমপায়ারটি সিস্টেম ডিয়ারে রয়েছে। অন্যথায় আপনাকে সুপার ব্যবহারকারী হিসাবে লগ ইন করতে হবে। ম্যাকের জন্য আপনাকে এসইউ অ্যাক্সেস সক্ষম / কনফিগার করতে হবে (এটি ডিফল্টরূপে উপলভ্য নয়) তবে আপনি যদি গো ইনস্টল করতে সক্ষম হন তবে আপনার সম্ভবত ইতিমধ্যে রুট অ্যাক্সেস রয়েছে।

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

আপনি যে লক্ষ্যগুলি তৈরি করতে চান তাতে জিওওএস এবং গোরচার পরিবর্তন করুন।

আপনার যদি সিজিওর সাথে সমস্যা দেখা দেয় তবে কমান্ড লাইনে সিজিও_ইএনএবিএলডি = 0 অন্তর্ভুক্ত করুন। এছাড়াও লক্ষ করুন যে লিনাক্স এবং ম্যাকের বাইনারিগুলির কোনও এক্সটেনশন নেই তাই আপনি বিভিন্ন ফাইল রাখার কারণে এক্সটেনশন যুক্ত করতে পারেন। -o স্যুইচ নির্দেশাবলী সি / সি ++ এর জন্য পুরানো সংকলকগুলির মতো আউটপুট ফাইল তৈরি করতে যান এভাবে উপরে ব্যবহৃত অ্যাপনাম.লিনাক্স অন্য কোনও এক্সটেনশন হতে পারে।


আমাকে প্রাথমিকভাবে যা বিভ্রান্ত করেছে তা হ'ল সংকলনের প্রথম অংশে বলা হয়েছে: # 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
হোমব্রিউতে প্যাকেজের প্যাকেজের একটি বিকল্প রয়েছে "- ক্রস-কম্পাইল-অল" যা স্বয়ংক্রিয়ভাবে সমস্ত ক্রস সংকলক তৈরি করবে।
নিমরোডম

8
দুর্দান্ত টিপ @ নিমরোডম! আপনার গো ইনস্টলেশনটি পুনরায় কম্পাইল করতে আপনার রান করা দরকারbrew reinstall go --cross-compile-all
লিনক

1
@ljgww 'sudo' তে ENV কনফিগার করা নেই। আমি / ইউএসআর / লোকাল / গো / পিকেজি / লিনাক্স_এএমডি 64 /
নুনো সিলভা

63

আপনি যদি ওএস এক্সে হোমব্রু ব্যবহার করেন তবে আপনার কাছে একটি সহজ সমাধান রয়েছে:

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

অথবা ..

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

reinstallআপনি ইতিমধ্যে goইনস্টল করা থাকলে ব্যবহার করুন ।


3
আপডেট হওয়া স্যুইচগুলি লক্ষ্য করা যায়: - ক্রস-কম্পাইল-অলস সমর্থিত সমস্ত প্ল্যাটফর্মগুলির জন্য ক্রস-সংকলক এবং রানটাইম সমর্থন তৈরি করুন - ক্রস-কম্পাইল-সাধারণ দারউইন, লিনাক্স এবং উইন্ডোজের জন্য ক্রস-সংকলক এবং রানটাইম সমর্থন তৈরি করুন
চিপ টোল

3
--cross-compile-allএখন--with-cc-all
জিয়ানবাও

@ sheeks06 - স্থির। ধন্যবাদ!
ডোকাটা

1
আমি যা বলতে পারি সেগুলি থেকে এই পতাকাগুলি আর বিদ্যমান নেই। কেবলমাত্র প্রাসঙ্গিক বিকল্পটি আমি দেখতে পাচ্ছি
ছাড়া

5
1.5 এ যাওয়ার পরে, কোনও আলাদা ক্রস-সংকলক নেই, আপনি এখন কেবল
চকাস

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-program-used-docker-beaa102a316d


1
কেন কেউ ডকারকে এটি করতে যখন ইনস্টল করতে চাইবে যখন তারা কেবল শেল লুপ env GOOS=x GOARCH=y go install something/...শেষ করতে পারে এবং যথাযথ বাইনারিগুলি দিয়ে শেষ করতে পারে $GOPATH/bin/$GOOS_$GOARCH?? এবং বিটিডাব্লু, গো আপনার তালিকাভুক্ত তিনটি ওএসের চেয়ে বেশি সমর্থন করে, কেন বিএসডিগুলির প্রতি ভালবাসা নেই?
ডেভ সি

8
আপনি এটি করার জন্য ডকার ইনস্টল করবেন না, তবে আপনার যদি এটি থাকে তবে বিকল্পগুলির চেয়ে এটি সহজ এবং পরিষ্কার er
ট্র্যাভিস রেডার

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

আমি এই স্ক্রিপ্টটি কেবল ওএসএক্স-এ পরীক্ষা করেছি

গিস্ট - go-executable- build.sh


ঠিক আমি যা খুঁজছিলাম ... আমি এটি ডকোরাইজড করেছি :) gist.github.com/marcellodesales/…
মার্সেলো ডি বিক্রয়

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

আপনি যদি আমার মতো হন এবং আপনাকে সিজিও দিয়ে সংকলন করতে হবে। এটি আমিই করেছি:

1. আমরা একটি সিজিও নির্ভর গ্রন্থাগার সহ উইন্ডোগুলির জন্য সংকলনটি অতিক্রম করতে যাচ্ছি। প্রথমে আমাদের মতো একটি ক্রস সংকলক প্রয়োজনmingw-w64

brew install mingw-w64

এটি সম্ভবত এটি এখানে ইনস্টল করবে /usr/local/opt/mingw-w64/bin/

২. অন্যান্য জবাবগুলির মতো কেবল আমাদের উইন্ডোজ খিলানটি এখন আমাদের গো সংকলক সরঞ্জামচেইনে যুক্ত করা দরকার। একটি সংকলক সংকলনের জন্য একটি সংকলক প্রয়োজন (অদ্ভুত বাক্য) সংকলন গো সংকলকটির জন্য পৃথক প্রাক-অন্তর্নির্মিত সংকলক প্রয়োজন। আমরা একটি ফোল্ডারে প্রাক-বিল্ট বাইনারি ডাউনলোড করতে পারি বা উত্স থেকে বিল্ড ~/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

৩. এখন 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.