मेरे लिनक्स होस्ट मशीन पर रास्पबेरी पाई क्रॉस कंपाइलर कैसे स्थापित करें?


114

मैं अपने उबंटू मशीन पर काम करने वाले रास्पबेरी पाई के लिए क्रॉस-संकलन प्राप्त करने का प्रयास कर रहा हूं।

अपने शुरुआती प्रयासों के दौरान मैं आर्म-लाइनक्स-गुनैबी कंपाइलर का उपयोग कर रहा था, जो उबंटू रेपो में उपलब्ध है। मुझे यह काम मिला। मैं अपने सभी आश्रितों का निर्माण करने और अपने cmake प्रोजेक्ट में क्रॉस-कंपाइलर का उपयोग करने में सक्षम था।

हालांकि, मेरा मानना ​​है कि मुझे hf संस्करण का उपयोग करना चाहिए, इसलिए मैंने हाथ-लिनुक्स-गनीबाइफ़ पर स्विच किया। तब मुझे एहसास हुआ कि यह रास्पबेरी पाई के साथ काम नहीं करता है क्योंकि यह आर्मव 6 है।

कुछ Googling के बाद, मैंने तब GitHub से पूर्व-निर्मित टूलचैन पाया ।

मैंने टूलचैन को डाउनलोड किया, लेकिन मुझे वास्तव में समझ नहीं आया कि इसे "कैसे" स्थापित किया जाए। मैंने अपने होम डायरेक्टरी में फाइलें निकालीं। निर्देशिका संरचना इस तरह दिखती है:

/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)

अगर मैं निर्देशिका को INNER बिन फ़ोल्डर में बदलता हूं तो मैं बिना किसी समस्या के टर्मिनल से एक परीक्षण कार्यक्रम संकलित करने में सक्षम हूं।

~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/
arm-linux-gnueabihf/bin$ g++ test.cpp -o test

मैंने तब OUTER बिन फ़ोल्डर में एक परीक्षण कार्यक्रम संकलित करने की कोशिश की, जिसमें उपकरण के उपसर्ग संस्करण शामिल हैं।

 ~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin$ 
 arm-linux-gnueabihf-g++ test.cpp -o test

हालाँकि, जब मैं अब (आंतरिक बिन निर्देशिका के बाहर से) कंपाइलर का उपयोग करने की कोशिश करता हूं, तो यह libstdc ++ साझा लाइब्रेरी को खोजने में असमर्थ है जो टूलकिन के साथ आता है:

arm-linux-gnueabihf-gcc: error while loading shared libraries: 
libstdc++.so.6: cannot open shared object file: No such file or directory.

इसके अलावा, मैं बिन निर्देशिका में नेविगेट किए बिना संकलक का उपयोग करने में सक्षम होना चाहता हूं। इसलिए मैंने OUTER बिन निर्देशिका को जोड़ने की कोशिश की (क्योंकि मैं उपसर्ग वाले संस्करण चाहता हूं) और मेरे PATH के लिए दोनों कार्यकारी निर्देशिकाएं:

export PATH=$PATH:~/tools/.../bin
export PATH=$PATH:~/tools/.../lib
export PATH=$PATH:~/tools/.../.../lib

हालाँकि, यह एक ही त्रुटि में परिणाम। मुझे टूलकिन को कैसे "इनस्टॉल" करना चाहिए ताकि मैं हर जगह से टूलचिन का उपयोग कर सकूँ, जैसे मैं उबंटू रेपो से क्रॉस-कंपाइलर का उपयोग कर सकता हूँ?


Dir स्थापित करने के लिए CMAKE_C {XX} _FLAGS के माध्यम से सेटिंग सेट करें।
एनसेलन

मैंने --sysroot के लिए कुछ अलग रास्तों की कोशिश की, लेकिन इससे कोई फायदा नहीं हुआ। मुझे सच में यकीन नहीं है कि मुझे सिसरोट के लिए कौन सा रास्ता बताना चाहिए। टूलचिन की निर्देशिका संरचना के बारे में ऊपर देखें। इसके अलावा, कुछ Googling को लगता है कि --sysroot libstdc ++ के लिए मदद नहीं करता है।
pqvst

मैं या तो कोशिश करूँगा / gcc-linearo-arm-linux-gnueabihf-raspbian या / gcc-linearo-arm-linux-gnueabihf-raspbian / arm-linux-gnueabihf
असेलन

यहाँ लॉन्चपैड ./gcc-arm-embedded पर जाएं और टैरबॉल डाउनलोड करें और निकालें। बिन दिर अपना रास्ता तय किया ... किया। या codeourcery.com पर जाएं (अब मेंटर ग्राफिक्स) लाइट संस्करण प्राप्त करें, अनटार / bz, बिन dir के लिए अपना रास्ता सेट करें ... किया।
Old_timer

जवाबों:


235

मैं इसे आपके लिए एक ट्यूटोरियल के रूप में लिखने का प्रयास करने जा रहा हूं, इसलिए इसका पालन करना आसान हो जाता है।

नोट: यह ट्यूटोरियल केवल पुराने रास्पियन छवियों के लिए काम करता है। डेबियन बस्टर पर आधारित नए रास्पबियन के लिए निम्नलिखित देखें कि इस धागे में कैसे: https://stackoverflow.com/a/58559140/869402

पूर्व आवश्यकताएं

शुरू करने से पहले आपको यह सुनिश्चित करने की आवश्यकता है कि निम्नलिखित स्थापित है:

apt-get install git rsync cmake ia32-libs

चलो एक संकलन संकलन पार!

कहा जाता है अपने घर निर्देशिका में एक फ़ोल्डर बनाने के साथ शुरू करो raspberrypi

इस फ़ोल्डर पर जाएं और ऊपर उल्लिखित ENTIRE टूल फ़ोल्डर को नीचे खींचें:

git clone git://github.com/raspberrypi/tools.git

यदि आप gcc-linaro-arm-linux-gnueabihf-raspbianगलत नहीं पढ़ते हैं, तो आप निम्नलिखित 3 का उपयोग करना चाहते हैं।

अपनी होम निर्देशिका में जाएं और जोड़ें:

export PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin

नामित फ़ाइल के अंत तक ~/.bashrc

अब आप या तो लॉग आउट कर सकते हैं और वापस लॉग इन कर सकते हैं (अर्थात अपने टर्मिनल सत्र को पुनः आरंभ करें), या . ~/.bashrcअपने टर्मिनल में PATHअतिरिक्त टर्मिनल सत्र को लेने के लिए अपने टर्मिनल में दौड़ें ।

अब, सत्यापित करें कि आप कंपाइलर का उपयोग कर सकते हैं arm-linux-gnueabihf-gcc -v। आपको कुछ इस तरह से मिलना चाहिए:

Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/home/tudhalyas/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/../libexec/gcc/arm-linux-gnueabihf/4.7.2/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: /cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.b
 uild/src/gcc-linaro-4.7-2012.08/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-
 linux-gnu --target=arm-linux-gnueabihf --prefix=/cbuild/slaves/oort61/crosstool-ng/builds/arm-l
 inux-gnueabihf-raspbian-linux/install --with-sysroot=/cbuild/slaves/oort61/crosstool-ng/builds/
 arm-linux-gnueabihf-raspbian-linux/install/arm-linux-gnueabihf/libc --enable-languages=c,c++,fo
 rtran --disable-multilib --with-arch=armv6 --with-tune=arm1176jz-s --with-fpu=vfp --with-float=
 hard --with-pkgversion='crosstool-NG linaro-1.13.1+bzr2458 - Linaro GCC 2012.08' --with-bugurl=
 https://bugs.launchpad.net/gcc-linaro --enable-__cxa_atexit --enable-libmudflap --enable-libgom
 p --enable-libssp --with-gmp=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-rasp
 bian-linux/.build/arm-linux-gnueabihf/build/static --with-mpfr=/cbuild/slaves/oort61/crosstool-
 ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-mpc
 =/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-
 gnueabihf/build/static --with-ppl=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf
 -raspbian-linux/.build/arm-linux-gnueabihf/build/static --with-cloog=/cbuild/slaves/oort61/cros
 stool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static --wi
 th-libelf=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-linux/.build/a
 rm-linux-gnueabihf/build/static --with-host-libstdcxx='-L/cbuild/slaves/oort61/crosstool-ng/bui
 lds/arm-linux-gnueabihf-raspbian-linux/.build/arm-linux-gnueabihf/build/static/lib -lpwl' --ena
 ble-threads=posix --disable-libstdcxx-pch --enable-linker-build-id --enable-plugin --enable-gol
 d --with-local-prefix=/cbuild/slaves/oort61/crosstool-ng/builds/arm-linux-gnueabihf-raspbian-li
 nux/install/arm-linux-gnueabihf/libc --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.7.2 20120731 (prerelease) (crosstool-NG linaro-1.13.1+bzr2458 - Linaro GCC 2012.08
 )

लेकिन नमसते! मैंने ऐसा किया और काम अभी भी काम नहीं करता है!

हम अभी तक नहीं कर रहे हैं! अब तक, हमने केवल मूल बातें की हैं।

अपने raspberrypiफोल्डर में, फोल्डर बनाएं rootfs

अब आपको इस नए बनाए गए फ़ोल्डर में संपूर्ण /libऔर /usrनिर्देशिका को कॉपी करने की आवश्यकता है । मैं आमतौर पर आरपीआई छवि लाता हूं और इसे rsync के माध्यम से कॉपी करता हूं:

rsync -rl --delete-after --safe-links pi@192.168.1.PI:/{lib,usr} $HOME/raspberrypi/rootfs

जहां 192.168.1.PIआपके रास्पबेरी पाई के आईपी द्वारा प्रतिस्थापित किया गया है।

अब, हमें एक cmakeविन्यास फाइल लिखने की जरूरत है । ~/home/raspberrypi/pi.cmakeअपने पसंदीदा संपादक में खोलें और निम्नलिखित डालें:

SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_C_COMPILER $ENV{HOME}/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER $ENV{HOME}/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-g++)
SET(CMAKE_FIND_ROOT_PATH $ENV{HOME}/raspberrypi/rootfs)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

अब आपको cmakeइस अतिरिक्त ध्वज को जोड़कर अपने कार्यक्रमों को संकलित करने में सक्षम होना चाहिए -D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake:।

एक cmake हैलो दुनिया उदाहरण का उपयोग कर :

git clone https://github.com/jameskbride/cmake-hello-world.git 
cd cmake-hello-world
mkdir build
cd build
cmake -D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmake ../
make
scp CMakeHelloWorld pi@192.168.1.PI:/home/pi/
ssh pi@192.168.1.PI ./CMakeHelloWorld

4
मैंने आपके ट्यूटोरियल स्टेप को स्टेप द्वारा फॉलो किया और अब मैं बिना किसी त्रुटि के कंपाइल करने में सक्षम हूं। धन्यवाद! Cmake उदाहरण सहित के लिए अतिरिक्त धन्यवाद।
pqvst

1
यह सरल परियोजनाओं के लिए अच्छी तरह से काम करता है, लेकिन मैं अपनी CMAKE परियोजना को पार नहीं कर सकता, जो कि opencv पर निर्भर करता है। मुझे निम्न त्रुटि मिलती है "/opt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/../lib/gcc/arm-linux-gnueabihf/4.7.2/../ .. /../../arm-linux-gnueabihf/bin/ld: चेतावनी: libjpeg.so.8, /opt/rpi-rootfs/usr/lib/libopencv_highfui.so द्वारा आवश्यक नहीं, पाया-उपयोग करने का प्रयास करें -rpath या -rpath-लिंक) "। Cmake पास करने के लिए भी लगता है "-Wl, -rpath, / opt / rpi-rootfs / usr / lib" ध्वज को लिंकर
user389238

18
ia32-libsपैकेज उबंटू 13.10 पर उपलब्ध नहीं है। मैं libc6-i386 lib32z1 lib32stdc++6इसके बजाय इस्तेमाल किया।
बेन टी

2
महान ट्यूटोरियल जवाब! एक इनाम है :)
andrewdotnich

2
एक संपूर्ण ट्यूटोरियल के लिए धन्यवाद! क्या आप कृपया बताएंगे कि pi मशीन से फोल्डर / लेबर / usr फोल्डर की आवश्यकता क्यों है?
मार्सेलो

14

नए रास्पियन डेबियन बस्टर छवियों और ARMv6 के लिए भवन

@ सेंटेनग का उत्तर केवल पुराने रास्पियन छवियों के लिए काम करता है। डेबियन बस्टर पर आधारित हाल ही में रिलीज़ हुई रास्पियन को एक अपडेटेड टूलचिन की आवश्यकता है:

डेबियन बस्टर में gcc कंपाइलर और glibc को 8.3 संस्करण में अपडेट किया गया था। टूलकिन git://github.com/raspberrypi/tools.gitअभी भी पुराने gcc 6 संस्करण पर आधारित है। इसका मतलब है कि उपयोग git://github.com/raspberrypi/tools.gitकरने से कई संकलन त्रुटियां हो जाएंगी।

यह ट्यूटोरियल @Stenyg उत्तर पर आधारित है। इंटरनेट में कई अन्य समाधानों के अलावा, यह ट्यूटोरियल ARMv6 सीपीयू पर आधारित पुराने रैस्पररी पाई (ए, बी, बी +, जीरो ) का भी समर्थन करता है । इसे भी देखें: ARMv6 की जगह GCC 8 क्रॉस कंपाइलर ARMv7 एक्ज़ीक्यूटेबल

Toolchain सेट करें

अपडेटेड टूलचैन (आधिकारिक https://github.com/raspberrypi/tools/issues/102 देखें ) युक्त कोई आधिकारिक गिट रिपॉजिटरी नहीं है ।

मैंने एक नया github रिपॉजिटरी बनाया, जिसमें GCC8 और नए के आधार पर ARMv6 के लिए भवन निर्माण और पूर्वनिर्मित टूलचिन शामिल हैं:

https://github.com/Pro/raspi-toolchain

जैसा कि परियोजना की रीडमी में बताया गया है, ये टूलचिन प्राप्त करने के चरण हैं। आप इसे स्वयं भी बना सकते हैं (आगे की जानकारी के लिए README देखें)।

  1. टूलचिन डाउनलोड करें:
wget https://github.com/Pro/raspi-toolchain/releases/latest/download/raspi-toolchain.tar.gz
  1. इसे निकालें। नोट: टूलचैन का होना आवश्यक है /opt/cross-pi-gccक्योंकि यह स्वतंत्र नहीं है।
sudo tar xfz raspi-toolchain.tar.gz --strip-components=1 -C /opt
  1. आप कर चुके हैं! टूलकिन अब अंदर है/opt/cross-pi-gcc

  2. वैकल्पिक, टूलचिन को अपने पथ में जोड़ें, जोड़कर:

export PATH=$PATH:/opt/cross-pi-gcc/bin

नामित फ़ाइल के अंत तक ~/.bashrc

अब आप या तो लॉग आउट कर सकते हैं और वापस लॉग इन कर सकते हैं (अर्थात अपने टर्मिनल सत्र को पुनः आरंभ करें), या . ~/.bashrcअपने टर्मिनल में PATHअतिरिक्त टर्मिनल सत्र को लेने के लिए अपने टर्मिनल में दौड़ें ।

रास्पबेरी पीआई से पुस्तकालय प्राप्त करें

अपने स्वयं के रास्पबेरी पाई के लिए क्रॉस-संकलन करने के लिए, जिसमें कुछ कस्टम लाइब्रेरी स्थापित हो सकती हैं, आपको इन पुस्तकालयों को अपने होस्ट पर प्राप्त करने की आवश्यकता है।

एक फ़ोल्डर बनाएँ $HOME/raspberrypi। अपने raspberrypiफोल्डर में, फोल्डर बनाएं rootfs

अब आपको इस नए बनाए गए फ़ोल्डर में संपूर्ण /libऔर /usrनिर्देशिका को कॉपी करने की आवश्यकता है । मैं आमतौर पर आरपीआई छवि लाता हूं और इसे rsync के माध्यम से कॉपी करता हूं:

rsync -vR --progress -rl --delete-after --safe-links pi@192.168.1.PI:/{lib,usr,opt/vc/lib} $HOME/raspberrypi/rootfs

जहां 192.168.1.PIआपके रास्पबेरी पाई के आईपी द्वारा प्रतिस्थापित किया गया है।

अपने प्रोजेक्ट को संकलित करने के लिए CMake का उपयोग करें

अपने खुद के टूलकिन लेने के लिए सीएमके को बताने के लिए, आपके पास एक टूलचैन फ़ाइल होनी चाहिए जो कंपाइलर सेटिंग्स को इनिशियलाइज़ करती है।

इस टूलचैन फ़ाइल को यहाँ से प्राप्त करें: https://github.com/Pro/raspi-toolchain/blob/master/Toolchain-rpi.cmake

अब आपको cmakeइस अतिरिक्त ध्वज को जोड़कर अपने कार्यक्रमों को संकलित करने में सक्षम होना चाहिए : -D CMAKE_TOOLCHAIN_FILE=$HOME/raspberrypi/pi.cmakeऔर सही पर्यावरण चर सेट करना:

export RASPBIAN_ROOTFS=$HOME/raspberry/rootfs
export PATH=/opt/cross-pi-gcc/bin:$PATH
export RASPBERRY_VERSION=1
cmake -DCMAKE_TOOLCHAIN_FILE=$HOME/raspberry/Toolchain-rpi.cmake ..

एक उदाहरण हैलो वर्ल्ड यहाँ दिखाया गया है: https://github.com/Pro/raspi-toolchain/blob/master/build_hello_world.sh


मुझे rsync के दौरान "असुरक्षित सिम्लिंक को अनदेखा करना" संदेश मिलता है। ठीक है न?
एलेक्जेंड्रा ज़ुर्बकिन

ठीक होना चाहिए। यह --safe-linksतर्क के कारण है
स्टीफन प्रोफेसर ने

दुर्भाग्य से मैं इसे 4 रास्पि के लिए परीक्षण नहीं कर सकता, लेकिन चूंकि पुराने रास्पि से निष्पादन योग्य सामान्य रूप से नए रास्पी पर भी निष्पादित किए जा सकते हैं, इसलिए यह भी काम करना चाहिए। अगर कोई इसका परीक्षण कर सकता है, तो मुझे विवरण अपडेट करने में खुशी हो रही है
स्टीफन प्रोफनर

नमस्ते वहाँ @StefanProfanter, एक टूलचैन पथ को स्वतंत्र बनाने के बारे में कैसे जाना जाएगा ताकि इसे अन्य मार्ग में रखा जा सके /opt/cross-pi-gcc ?
नास

@ दुर्भाग्य दुर्भाग्य से नहीं। मैं क्रॉस कंपाइलर का विशेषज्ञ नहीं हूं। यदि किसी के पास अधिक अंतर्दृष्टि है और इस पर जानकारी है, तो मुझे अपने रेपो को अपडेट करने में खुशी होगी! शायद आप एक नया Stackoverflow प्रश्न बना सकते हैं।
स्टेफन प्रोफनर

5

मैं कंपाइलर ( x64संस्करण) का उपयोग तब sysrootतक नहीं कर सका जब तक मैंने इसमें जोड़ा SET(CMAKE_SYSROOT $ENV{HOME}/raspberrypi/rootfs)नहीं pi.cmake


मैं CMAKE_SYSROOT सेट के बिना हैलो वर्ल्ड उदाहरण चला सकता हूं, लेकिन एक प्रोजेक्ट के साथ pi.cmake फ़ाइल की कोशिश करते समय जो एक साझा लाइब्रेरी का उपयोग करता है मुझे लिंकर त्रुटि libstdc ++ मिला। इसलिए 6 नहीं मिला। जब मैंने CMAKE_SYSROOT सेट किया तो सब कुछ त्रुटिपूर्ण हो गया।
माइकल हिल्बर्ट

4

विंडोज होस्ट के लिए, मैं इस ट्यूटोरियल की अत्यधिक अनुशंसा करना चाहता हूं :

  • टूलचिन डाउनलोड और इंस्टॉल करें
  • आपके RPi के साथ सिंक sysroot में / लिबरल डायरेक्टरी शामिल हैं
  • अपना कोड संकलित करें
  • खींचें और अपने आरपीआई का उपयोग कर के लिए निष्पादन योग्य ड्रॉप SmarTTY
  • चलाओ!

न कुछ ज्यादा, न कुछ कम!

रास्पबेरी, बीगलबोन, क्यूबीबोर्ड, एवीआर (एटमेल) और अधिक के लिए उपलब्ध जीएनयू टूलचाइन्स


सवाल के शरीर की पहली पंक्ति के बाद से संपादन "मैं अपने उबंटू मशीन पर काम कर रहे रास्पबेरी पाई के लिए क्रॉस-संकलन प्राप्त करने का प्रयास कर रहा हूं।" और मैंने स्पष्ट किया है कि शीर्षक पर। यह उत्तर अभी भी स्वागत योग्य है, लेकिन आप इस पर भी जवाब देना चाह सकते हैं: raspberrypi.stackexchange.com/questions/27163/… जो अधिक विशिष्ट है।
सिरो संतिली 郝海东 冠状 iro i 法轮功 '

4

आप क्लैंग का भी उपयोग कर सकते हैं । यह जीसीसी की तुलना में तेज हुआ करता था, और अब यह काफी स्थिर चीज है। सूत्रों से क्लैंग का निर्माण करना बहुत आसान है ( आप निर्माण प्रक्रिया के दौरान वास्तव में कॉफी के कप पी सकते हैं )।

संक्षेप में:

  1. क्लैंग बायनेरीज़ प्राप्त करें (sudo apt-get install clang) .. या डाउनलोड करें और निर्माण करें ( यहाँ निर्देश पढ़ें )
  2. अपने रास्पबेरी रूटफुट को माउंट करें (यह sshfs, या एक छवि के माध्यम से माउंट किए गए वास्तविक रूटफ़्स हो सकते हैं)।
  3. अपना कोड संकलित करें:

    path/to/clang --target=arm-linux-gnueabihf --sysroot=/some/path/arm-linux-gnueabihf/sysroot my-happy-program.c -fuse-ld=lld

वैकल्पिक रूप से आप लीगेसी आर्म-लिनेक्स-गनीअबीह बिनुटिल्स का उपयोग कर सकते हैं। फिर आप अंत में "-फ्यूज़-एलडी = लेल्ड" ध्वज को हटा सकते हैं।

नीचे मेरी cmake टूलचिन फ़ाइल है।

toolchain.cmake

set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

# Custom toolchain-specific definitions for your project
set(PLATFORM_ARM "1")
set(PLATFORM_COMPILE_DEFS "COMPILE_GLES")

# There we go!
# Below, we specify toolchain itself!

set(TARGET_TRIPLE arm-linux-gnueabihf)

# Specify your target rootfs mount point on your compiler host machine
set(TARGET_ROOTFS /Volumes/rootfs-${TARGET_TRIPLE})

# Specify clang paths
set(LLVM_DIR /Users/stepan/projects/shared/toolchains/llvm-7.0.darwin-release-x86_64/install)
set(CLANG ${LLVM_DIR}/bin/clang)
set(CLANGXX ${LLVM_DIR}/bin/clang++)

# Specify compiler (which is clang)
set(CMAKE_C_COMPILER   ${CLANG})
set(CMAKE_CXX_COMPILER ${CLANGXX})

# Specify binutils

set (CMAKE_AR      "${LLVM_DIR}/bin/llvm-ar" CACHE FILEPATH "Archiver")
set (CMAKE_LINKER  "${LLVM_DIR}/bin/llvm-ld" CACHE FILEPATH "Linker")
set (CMAKE_NM      "${LLVM_DIR}/bin/llvm-nm" CACHE FILEPATH "NM")
set (CMAKE_OBJDUMP "${LLVM_DIR}/bin/llvm-objdump" CACHE FILEPATH "Objdump")
set (CMAKE_RANLIB  "${LLVM_DIR}/bin/llvm-ranlib" CACHE FILEPATH "ranlib")

# You may use legacy binutils though.
#set(BINUTILS /usr/local/Cellar/arm-linux-gnueabihf-binutils/2.31.1)
#set (CMAKE_AR      "${BINUTILS}/bin/${TARGET_TRIPLE}-ar" CACHE FILEPATH "Archiver")
#set (CMAKE_LINKER  "${BINUTILS}/bin/${TARGET_TRIPLE}-ld" CACHE FILEPATH "Linker")
#set (CMAKE_NM      "${BINUTILS}/bin/${TARGET_TRIPLE}-nm" CACHE FILEPATH "NM")
#set (CMAKE_OBJDUMP "${BINUTILS}/bin/${TARGET_TRIPLE}-objdump" CACHE FILEPATH "Objdump")
#set (CMAKE_RANLIB  "${BINUTILS}/bin/${TARGET_TRIPLE}-ranlib" CACHE FILEPATH "ranlib")

# Specify sysroot (almost same as rootfs)
set(CMAKE_SYSROOT ${TARGET_ROOTFS})
set(CMAKE_FIND_ROOT_PATH ${TARGET_ROOTFS})

# Specify lookup methods for cmake
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

# Sometimes you also need this:
# set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

# Specify raspberry triple
set(CROSS_FLAGS "--target=${TARGET_TRIPLE}")

# Specify other raspberry related flags
set(RASP_FLAGS "-D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS")

# Gather and distribute flags specified at prev steps.
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CROSS_FLAGS} ${RASP_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CROSS_FLAGS} ${RASP_FLAGS}")

# Use clang linker. Why?
# Well, you may install custom arm-linux-gnueabihf binutils,
# but then, you also need to recompile clang, with customized triple;
# otherwise clang will try to use host 'ld' for linking,
# so... use clang linker.
set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld)

2

मैं git से किसी भी (काफी पुराने) टूलचैन के साथ qt5 को संकलित नहीं कर सका: //github.com/raspberrypi/tools.git। कॉन्फ़िगर स्क्रिप्ट "" आर्किटेक्चर का निर्धारण नहीं कर सका "त्रुटि के साथ असफल रही और निर्देशिकाओं के लिए बड़े पैमाने पर पथ समस्याओं के साथ। मेरे लिए जो काम किया वह लिनारो टूलकिन का उपयोग कर रहा था

http://releases.linaro.org/components/toolchain/binaries/4.9-2016.02/arm-linux-gnueabihf/runtime-linaro-gcc4.9-2016.02-arm-linux-gnueabihf.tar.xz

के साथ सम्मिलन में

https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py

सिसरोट के सिम्बलिंक को ठीक करने में विफल रहने से अपरिचित प्रतीक त्रुटियों का वर्णन यहां किया गया है: रास्पबेरी पाई के लिए क्यूटी लाइब्रेरी बनाने में एक त्रुटि। यह मेरे साथ तब हुआ जब मैंने fixQualifiedLibraryPath स्क्रिप्ट को टूल.जेट से आज़माया। Http://wiki.qt.io/RaspberryPi2EGLFS में विस्तार से वर्णन किया गया है । मेरी कॉन्फ़िगर सेटिंग्स थीं:

./configure -opengl es2 -device linux-rpi3-g ++ -device-विकल्प CROSS_COMPILE = / usr / लोकल / रस / gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf / bin / arm-gnueabifile / usr / स्थानीय / rasp / sysroot -opensource -confirm-लाइसेंस -optimized-qmake -reduce-export -release -make libs -prefix / usr / स्थानीय / qt5pi -hostprefix / usr / स्थानीय / qt5pi

/ usr / local / rasp / sysroot मेरे स्थानीय रास्पबेरी Pi 3 रास्पियन (जेसी) सिस्टम कॉपी और / usr / लोकल / qt5pi का पथ होने के कारण क्रास संकलित क्यूटी का पथ होने के कारण जिसे डिवाइस में कॉपी करना है। ध्यान रखें कि जब आप अपना टूलचेन चुनते हैं तो जेसी जीसीसी 4.9.2 के साथ आता है।


2

प्रारंभिक प्रश्न कुछ समय पहले पोस्ट किया गया है और इस बीच में डेबियन ने मल्टीकार समर्थन के क्षेत्र में भारी बढ़त बना ली है।

क्रॉस संकलन के लिए मल्टीकार एक बड़ी उपलब्धि है!

संक्षेप में, रास्पियन जेसी पार संकलन के लिए मल्टीकार का लाभ उठाने के लिए निम्नलिखित चरणों की आवश्यकता होती है:

  • अपने उबंटू मेजबान पर एक चेरोट या एलएक्ससी कंटेनर के भीतर डेबियन जेसी एमड64 स्थापित करें।
  • विदेशी वास्तुकला armhf सक्षम करें।
  • Emdebian उपकरण रिपॉजिटरी से क्रॉस कंपाइलर स्थापित करें।
  • क्रॉस कंपाइलर (यह डिफ़ॉल्ट रूप से ARMv7-A के लिए कोड जनरेट करेगा) एक कस्टम gcc स्पेक्स फाइल लिखकर।
  • रास्पियन रिपॉजिटरी से आर्मफ लाइब्रेरी (libstdc ++ आदि) स्थापित करें।
  • अपना सोर्स कोड बनाएं।

चूंकि यह बहुत काम है मैंने उपरोक्त सेटअप को स्वचालित किया है। आप इसके बारे में यहां पढ़ सकते हैं:

रास्पियन के लिए क्रॉस संकलन


1

वहाँ एक सीडीपी स्टूडियो आईडीई उपलब्ध है जो क्रॉस कंपाइल करता है और विंडोज़ और लिनक्स दोनों से काफी सरल है और आप स्थापना के दौरान बस रास्पबेरी टूलचैन चेकबॉक्स की जाँच कर सकते हैं। (PS। इसमें GPIO और I2C का समर्थन है, ताकि उन तक पहुंचने के लिए किसी कोड की आवश्यकता न हो)

रास्पबेरी के उपयोग का IDE डेमो यहाँ है: https://youtu.be/4SVZ68sQz5U

और आप यहां आईडीई डाउनलोड कर सकते हैं: https://cdpstudio.com/home-edition

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