Saya mencoba melakukan kompilasi silang untuk Raspberry Pi yang bekerja di mesin Ubuntu saya.
Selama upaya awal saya, saya menggunakan kompiler arm-linux-gnueabi, yang tersedia di repo Ubuntu. Saya mendapatkan ini bekerja. Saya dapat membangun semua dependensi saya dan menggunakan kompiler silang dalam proyek cmake saya.
Namun, saya yakin saya harus menggunakan versi hf, jadi saya beralih ke arm-linux-gnueabihf. Kemudian saya menyadari bahwa ini tidak berfungsi dengan Raspberry Pi karena armv6.
Setelah beberapa Googling, saya kemudian menemukan toolchain yang sudah dibuat sebelumnya dari GitHub .
Saya mengunduh toolchain, tetapi saya tidak begitu mengerti bagaimana cara "menginstal" nya. Saya mengekstrak file ke direktori home saya. Struktur direktori terlihat seperti ini:
/gcc-linearo-arm-linux-gnueabihf-raspbian
/arm-linux-gnueabihf
/bin
(contains g++, gcc, etc)
/lib
(contains libstdc++ library)
/bin
(contains arm-linux-gnueabihf-g++, arm-linux-gnueabihf-...)
/lib
(gcc lib stuff)
Jika saya mengubah direktori ke folder bin INNER, saya dapat menyusun program uji dari terminal tanpa masalah.
~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/
arm-linux-gnueabihf/bin$ g++ test.cpp -o test
Saya kemudian mencoba untuk mengkompilasi program uji di folder tempat sampah OUTER, yang berisi versi alat yang diawali.
~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin$
arm-linux-gnueabihf-g++ test.cpp -o test
Namun, ketika saya mencoba menggunakan kompiler sekarang (dari luar direktori bin bagian dalam), ia tidak dapat menemukan perpustakaan bersama libstdc ++ yang disertakan dengan toolchain:
arm-linux-gnueabihf-gcc: error while loading shared libraries:
libstdc++.so.6: cannot open shared object file: No such file or directory.
Selain itu, saya ingin dapat menggunakan kompiler tanpa harus membuka direktori bin. Jadi saya mencoba menambahkan direktori bin OUTER (karena saya ingin versi awalan) dan kedua direktori lib ke PATH saya:
export PATH=$PATH:~/tools/.../bin
export PATH=$PATH:~/tools/.../lib
export PATH=$PATH:~/tools/.../.../lib
Namun, ini menghasilkan kesalahan yang sama. Bagaimana saya harus "menginstal" toolchain sehingga saya dapat menggunakan toolchain dari mana saja, seperti yang saya bisa ketika saya menggunakan cross-compiler dari repo Ubuntu?
sumber
Jawaban:
Saya akan mencoba menulis ini sebagai tutorial untuk Anda agar mudah diikuti.
CATATAN: Tutorial ini hanya berfungsi untuk gambar raspbian lama. Untuk Raspbian yang lebih baru berdasarkan Debian Buster, lihat petunjuk berikut di utas ini: https://stackoverflow.com/a/58559140/869402
Prasyarat
Sebelum Anda mulai, Anda perlu memastikan yang berikut ini telah diinstal:
Mari kita menyusun ulang Pie!
Mulailah dengan membuat folder di direktori home Anda dengan nama
raspberrypi
.Masuk ke folder ini dan tarik ke bawah seluruh folder alat yang Anda sebutkan di atas:
Anda ingin menggunakan yang berikut dari 3 yang
gcc-linaro-arm-linux-gnueabihf-raspbian
, jika saya tidak salah baca.Masuk ke direktori home Anda dan tambahkan:
ke akhir file bernama
~/.bashrc
Sekarang Anda dapat keluar dan masuk kembali (yaitu memulai kembali sesi terminal Anda), atau menjalankan
. ~/.bashrc
di terminal Anda untuk mengambilPATH
tambahan dalam sesi terminal Anda saat ini.Sekarang, verifikasi bahwa Anda dapat mengakses kompiler
arm-linux-gnueabihf-gcc -v
. Anda harus mendapatkan sesuatu seperti ini:Tapi hey! Saya melakukan itu dan libs masih tidak berfungsi!
Kami belum selesai! Sejauh ini, kami hanya melakukan dasar-dasarnya.
Di
raspberrypi
folder Anda , buat folder bernamarootfs
.Sekarang Anda perlu menyalin seluruh direktori
/lib
dan/usr
ke folder yang baru dibuat ini. Saya biasanya memunculkan gambar rpi dan menyalinnya melalui rsync:di mana
192.168.1.PI
diganti dengan IP Raspberry Pi Anda.Sekarang, kita perlu menulis
cmake
file konfigurasi. Buka~/home/raspberrypi/pi.cmake
di editor favorit Anda dan masukkan yang berikut ini:Sekarang Anda seharusnya dapat mengkompilasi
cmake
program Anda hanya dengan menambahkan tanda tambahan ini:-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
.Menggunakan contoh cmake hello world :
sumber
ia32-libs
paket tidak tersedia di Ubuntu 13.10. Saya menggunakanlibc6-i386 lib32z1 lib32stdc++6
sebagai gantinya.Dibuat untuk image Raspbian Debian Buster dan ARMv6 yang lebih baru
Jawaban oleh @Stenyg hanya berfungsi untuk gambar Raspbian yang lebih lama. Raspbian yang baru dirilis berdasarkan Debian Buster membutuhkan toolchain yang diperbarui:
Di Debian Buster, gcc compiler dan glibc telah diupdate ke versi 8.3. Toolchain
git://github.com/raspberrypi/tools.git
masih didasarkan pada versi gcc 6 yang lebih lama. Ini berarti bahwa penggunaangit://github.com/raspberrypi/tools.git
akan menyebabkan banyak kesalahan kompilasi.Tutorial ini didasarkan pada jawaban @Stenyg. Selain banyak solusi lain di internet, tutorial ini juga mendukung Rasperry Pi yang lebih lama (A, B, B +, Zero ) berdasarkan CPU ARMv6. Lihat juga: GCC 8 Cross Compiler mengeluarkan ARMv7 yang dapat dieksekusi, bukan ARMv6
Siapkan toolchain
Tidak ada repositori git resmi yang berisi toolchain yang diperbarui (Lihat https://github.com/raspberrypi/tools/issues/102 ).
Saya membuat repositori github baru yang mencakup membangun dan toolchain yang telah dikompilasi untuk ARMv6 berdasarkan GCC8 dan yang lebih baru:
https://github.com/Pro/raspi-toolchain
Seperti yang disebutkan dalam readme proyek, berikut adalah langkah-langkah untuk mendapatkan toolchain. Anda juga dapat membuatnya sendiri (lihat README untuk detail lebih lanjut).
/opt/cross-pi-gcc
karena tidak bergantung pada lokasi.Kamu selesai! Toolchain sekarang sudah masuk
/opt/cross-pi-gcc
Opsional, tambahkan toolchain ke jalur Anda, dengan menambahkan:
ke akhir file bernama
~/.bashrc
Sekarang Anda dapat keluar dan masuk kembali (yaitu memulai kembali sesi terminal Anda), atau menjalankan
. ~/.bashrc
di terminal Anda untuk mengambilPATH
tambahan dalam sesi terminal Anda saat ini.Dapatkan pustaka dari Raspberry PI
Untuk mengkompilasi silang untuk Raspberry Pi Anda sendiri, yang mungkin memiliki beberapa pustaka khusus yang diinstal, Anda perlu memasukkan pustaka ini ke host Anda.
Buat folder
$HOME/raspberrypi
. Diraspberrypi
folder Anda , buat folder bernamarootfs
.Sekarang Anda perlu menyalin seluruh direktori
/lib
dan/usr
ke folder yang baru dibuat ini. Saya biasanya memunculkan gambar rpi dan menyalinnya melalui rsync:di mana
192.168.1.PI
diganti dengan IP Raspberry Pi Anda.Gunakan CMake untuk mengkompilasi proyek Anda
Untuk memberi tahu CMake agar menggunakan toolchain Anda sendiri, Anda perlu memiliki file toolchain yang menginisialisasi pengaturan compiler.
Dapatkan file toolchain ini dari sini: https://github.com/Pro/raspi-toolchain/blob/master/Toolchain-rpi.cmake
Sekarang Anda seharusnya dapat mengkompilasi
cmake
program Anda hanya dengan menambahkan tanda tambahan ini:-D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake
dan mengatur variabel lingkungan yang benar:Contoh hello world ditampilkan di sini: https://github.com/Pro/raspi-toolchain/blob/master/build_hello_world.sh
sumber
--safe-links
argumen/opt/cross-pi-gcc
?Aku tidak bisa mendapatkan compiler (
x64
versi) untuk menggunakansysroot
sampai saya menambahkanSET(CMAKE_SYSROOT $ENV{HOME}/raspberrypi/rootfs)
untukpi.cmake
.sumber
Untuk host Windows, saya sangat merekomendasikan tutorial ini ::
Tidak lebih, tidak kurang!
GNU Toolchain prebuilt tersedia untuk Raspberry, Beaglebone, Cubieboard, AVR (Atmel) dan banyak lagi
sumber
Anda juga bisa menggunakan dentang . Dulu lebih cepat dari GCC, dan sekarang sudah cukup stabil. Jauh lebih mudah untuk membangun dentang dari sumber ( Anda benar-benar dapat minum secangkir kopi selama proses pembuatan ).
Pendeknya:
Kompilasi kode Anda:
Secara opsional, Anda dapat menggunakan binutils arm-linux-gnueabihf lama. Kemudian Anda dapat menghapus tanda "-fuse-ld = lld" di bagian akhir.
Di bawah ini adalah file toolchain cmake saya.
toolchain.cmake
sumber
Saya tidak dapat mengkompilasi QT5 dengan salah satu rantai alat (cukup usang) dari git: //github.com/raspberrypi/tools.git. Skrip konfigurasi terus gagal dengan kesalahan "tidak dapat menentukan arsitektur" dan dengan masalah jalur besar untuk direktori penyertaan. Apa yang berhasil bagi saya adalah menggunakan toolchain Linaro
dalam kombinasi dengan
Gagal untuk memperbaiki symlink dari sysroot menyebabkan kesalahan simbol yang tidak ditentukan seperti yang dijelaskan di sini: Kesalahan dalam membangun pustaka Qt untuk raspberry pi Ini terjadi pada saya ketika saya mencoba skrip fixQualifiedLibraryPaths dari tools.git. Yang lainnya dijelaskan secara rinci di http://wiki.qt.io/RaspberryPi2EGLFS . Pengaturan konfigurasi saya adalah:
dengan / usr / local / rasp / sysroot menjadi jalur salinan sistem Raspberry Pi 3 Raspbian (Jessie) lokal saya dan / usr / local / qt5pi menjadi jalur dari QT yang dikompilasi silang yang juga harus disalin ke perangkat. Ketahuilah bahwa Jessie hadir dengan GCC 4.9.2 saat Anda memilih toolchain.
sumber
Pertanyaan awal telah diposting beberapa waktu yang lalu dan sementara itu Debian telah membuat kemajuan besar di bidang dukungan multiarch.
Multiarch adalah pencapaian luar biasa untuk kompilasi silang!
Singkatnya, langkah-langkah berikut diperlukan untuk memanfaatkan multiarch untuk kompilasi silang Raspbian Jessie:
Karena ini banyak pekerjaan, saya telah mengotomatiskan pengaturan di atas. Anda dapat membacanya di sini:
Kompilasi Silang untuk Raspbian
sumber
ada CDP Studio IDE tersedia yang membuat kompilasi silang dan penerapan cukup sederhana baik dari windows maupun linux dan Anda cukup mencentang kotak centang raspberry toolchain selama instalasi. (PS. Memiliki dukungan GPIO dan I2C sehingga tidak diperlukan kode untuk mengaksesnya)
Demo IDE penggunaan raspberry ada di sini: https://youtu.be/4SVZ68sQz5U
dan Anda dapat mengunduh IDE di sini: https://cdpstudio.com/home-edition
sumber