Saya mencoba mengkompilasi lintas aplikasi go di OSX untuk membangun binari untuk windows dan linux. Saya telah membaca semua yang dapat saya temukan di internet. Contoh terdekat yang saya temukan telah dipublikasikan di (terlepas dari banyak diskusi yang belum selesai di milis go-nuts):
http://solovyov.net/en/2012/03/09/cross-compiling-go/
namun itu tidak berfungsi pada instalasi saya. Saya harus pergi 1.0.2. Karena 1.0.2 baru-baru ini terlihat bagi saya bahwa semua contoh di atas tidak berlaku untuk versi ini.
Mencoba melakukan ./make.bash --no-clean
dengan vars ENV diatur ke 386 / windows, ia membangun pergi, tetapi itu membangun pergi untuk instalasi saya yang darwin/amd64
dan sepenuhnya mengabaikan apa yang diatur dalam ENV yang seharusnya membangun kompiler yang berbeda.
Adakah yang menyarankan bagaimana hal itu dapat dilakukan (jika dapat dilakukan sama sekali)?
sumber
sudo
(kemungkinan saya akan mendapatkan ENV unix yang berbeda ketika sudo-ing sehingga GOOS & GOARCH tidak akan tersedia jika tidak dilakukan inline)CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash
- jika Anda mencoba untuk membaginya di lebih dari satu baris maka variabel lingkungan tidak akan diekspor yang sesuai dengan gejalaJawaban:
Dengan Go 1.5 mereka tampaknya telah meningkatkan proses kompilasi silang, yang berarti sudah dibangun sekarang. Tidak perlu
./make.bash
atau tidakbrew
. Proses ini dijelaskan di sini tetapi untuk TLDR-ers (seperti saya) di luar sana: Anda hanya mengaturGOOS
danGOARCH
variabel lingkungan dan menjalankan go membangun.Untuk copy paste yang lebih malas (seperti saya) di luar sana, lakukan sesuatu seperti ini jika Anda menggunakan sistem * nix:
Anda bahkan mempelajari
env
triknya, yang memungkinkan Anda mengatur variabel lingkungan hanya untuk perintah itu, sepenuhnya gratis.sumber
env
perintah berjalan hanya itu panggilan di lingkungan adat dan 'me-reset' setelah hal itu dilakukan. Misalnya dijalankanexport GOOS=windows
, maka perintah dengan atau tanpaenv
danecho $GOOS
sesudahnya. Denganenv
GOOS tidak berubah.env
. Aku berlariexport GOOS=windows
saatGOOS=linux bash -c 'echo "GOOS: $GOOS"'
ituecho "GOOS: $GOOS"
. Apakahenv
memberikan kompatibilitas yang lebih besar dengan dialek shell lain atau dengan platform lain? Jika tidak tampaknya berlebihan di sini.FOO=bar cmd
, jadi Anda harus menggunakannyaenv FOO=bar cmd
. Jadi saya pikir keuntungan terbesar untuk digunakanenv FOO=bar cmd
adalah kompatibilitas.env GOOS=linux GOARCH=386 go build -v github.com/path/to/your/app
dan bekerja seperti juaraBerkat bantuan yang baik dan sabar dari kacang golang, resepnya adalah sebagai berikut:
1) Kita perlu mengkompilasi Go compiler untuk berbagai platform target dan arsitektur. Ini dilakukan dari folder src pada instalasi go. Dalam kasus saya, instalasi Go terletak di dalam
/usr/local/go
sehingga untuk mengkompilasi kompiler Anda perlu mengeluarkanmake
utilitas. Sebelum melakukan ini, Anda perlu tahu beberapa peringatan.Ada masalah tentang perpustakaan CGO saat kompilasi silang sehingga perlu untuk menonaktifkan perpustakaan CGO.
Kompilasi dilakukan dengan mengubah lokasi ke sumber dir, karena kompilasi harus dilakukan dalam folder itu
kemudian kompilasi kompilator Go:
Anda perlu mengulangi langkah ini untuk setiap OS dan Arsitektur yang ingin Anda lintas kompilasi dengan mengubah parameter GOOS dan GOARCH.
Jika Anda bekerja dalam mode pengguna seperti yang saya lakukan, sudo diperlukan karena Go compiler ada di dir sistem. Kalau tidak, Anda harus masuk sebagai pengguna super. Pada Mac Anda mungkin perlu mengaktifkan / mengkonfigurasi akses SU (ini tidak tersedia secara default), tetapi jika Anda telah berhasil menginstal Go, Anda mungkin sudah memiliki akses root.
2) Setelah Anda membangun semua kompiler silang, Anda dapat dengan senang hati mengkompilasi aplikasi Anda dengan menggunakan pengaturan berikut ini misalnya:
Ubah GOOS dan GOARCH ke target yang ingin Anda buat.
Jika Anda mengalami masalah dengan CGO, sertakan CGO_ENABLED = 0 di baris perintah. Juga perhatikan bahwa binari untuk linux dan mac tidak memiliki ekstensi sehingga Anda dapat menambahkan ekstensi demi memiliki file yang berbeda. -o switch menginstruksikan Go untuk membuat file output yang mirip dengan kompiler lama untuk c / c ++ sehingga appname.linux yang digunakan di atas dapat berupa ekstensi lainnya.
sumber
# Building compilers and Go bootstrap tool for host, darwin/amd64
tetapi kemudian benar-benar berakhir sebagai:--- Installed Go for windows/386 in /usr/local/go Installed commands in /usr/local/go/bin
jadi orang harus mengamati akhir daripada mulai mengkompilasi kompiler.$ GOARCH=386 GOOS=linux go build app.go
dan mendapatkan kesalahan# 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
Jika Anda menggunakan Homebrew di OS X, maka Anda memiliki solusi yang lebih sederhana:
atau..
Gunakan
reinstall
jika Anda sudahgo
menginstal.sumber
--cross-compile-all
sekarang--with-cc-all
Anda dapat melakukan ini dengan cukup mudah menggunakan Docker, jadi tidak ada lib tambahan yang diperlukan. Jalankan saja perintah ini:
Anda dapat menemukan rincian lebih lanjut di pos ini: https://medium.com/iron-io-blog/how-to-cross-compile-go-programs-using-docker-beaa102a316d
sumber
env GOOS=x GOARCH=y go install something/...
dan berakhir dengan biner yang sesuai di bawah$GOPATH/bin/$GOOS_$GOARCH
?? Dan BTW, Go mendukung lebih dari tiga OS yang Anda daftarkan, mengapa tidak ada cinta untuk BSD?Proses membuat executable untuk banyak platform bisa sedikit membosankan, jadi saya sarankan untuk menggunakan skrip:
Saya memeriksa skrip ini hanya pada OSX
inti - go-executable-build.sh
sumber
Saya membutuhkan CGO diaktifkan saat mengkompilasi untuk windows dari mac saya karena saya telah mengimpor https://github.com/mattn/go-sqlite3 dan diperlukan. Kompilasi menurut jawaban lain memberi saya kesalahan:
Jika Anda seperti saya dan Anda harus melakukan kompilasi dengan CGO. Inilah yang saya lakukan:
1.Kita akan melintasi kompilasi untuk windows dengan pustaka CGO dependen. Pertama kita perlu menginstal kompilator silang seperti
mingw-w64
Ini mungkin akan menginstalnya di sini
/usr/local/opt/mingw-w64/bin/
.2.Just seperti jawaban lain, pertama kita perlu menambahkan lengkungan windows kita ke toolchain compiler kita sekarang. Mengkompilasi kompiler memerlukan kompiler (kalimat aneh) kompilasi go compiler membutuhkan kompilator pre-built terpisah. Kami dapat mengunduh binary prebuilt atau build from source dalam folder mis:
~/Documents/go
sekarang kami dapat meningkatkan kompiler Go kami, sesuai dengan jawaban teratas tetapi kali ini denganCGO_ENABLED=1
dan kompilator prebuilt kami yang terpisahGOROOT_BOOTSTRAP
(Pooya adalah nama pengguna saya):3.Sekarang saat mengkompilasi penggunaan kode Go kami
mingw
untuk mengkompilasi windows penargetan file go kami dengan CGO diaktifkan:sumber