ฉันจะสร้าง toolchain ของ GCC 4.7 สำหรับการคอมไพล์ข้ามได้อย่างไร


82

ฉันได้ถามคำถามนี้เกี่ยวกับ Stack Overflow แล้ว แต่ฉันต้องการทราบว่าใครสามารถสร้าง toolchain GCC 4.7 สำหรับการรวบรวมข้าม ARM (สำหรับโฮสต์ x86 / x86-64 Linux) มีคำแนะนำมากมายสำหรับการสร้าง GCC จากแหล่งที่มาและตัวรวบรวมข้ามที่มีอยู่จำนวนมากสำหรับรุ่น GCC รุ่นก่อน 4.7 4.7 ไม่ใช่รุ่นล่าสุด

การรวบรวม Rasp Pi ทำงานได้ดี แต่มันช้าไปหน่อยสำหรับการใช้งานจริง

ฉันกระตือรือร้นที่จะรวบรวมและฉันต้องการใช้เครื่องมือใหม่ล่าสุดและดีที่สุด


ดูเหมือนว่าจะเป็นไปตามเส้นที่ฉันต้องทำเช่นกัน เรากำลังพัฒนาสำหรับ ARM5 ที่ใช้งานกับ Arch Linux การพัฒนาอยู่บน Ubuntu Linux 10.04 LTS (วันนี้บางทีเราอาจจะอัพเกรดในวันพรุ่งนี้ฉันยังไม่รู้) ขณะนี้เรากำลังเรียกใช้ GCC 4.4 แต่สิ่งที่ฉันต้องทำจะมีประโยชน์หากไม่ต้องการ GCC 4.7 (ขั้นต่ำ) หากไม่ใช่ GCC 4.8 (หากเราสามารถจัดการได้) สำหรับคุณสมบัติภาษา C ++ 11 ดูเหมือนว่ากลุ่มเครื่องมือทั้งหมดที่มีให้สำหรับ ARM (5 หรืออย่างอื่น) จะล้าสมัยไปแล้วหมดหนทาง เป็นไปได้ไหมที่จะสร้างเครือข่ายเครื่องมือคอมไพเลอร์ข้ามจากแหล่งที่มาและสนับสนุน GCC ที่เราต้องการ?
mwpowellhtx

ฉันมีปัญหาเล็กน้อยในขั้นตอนที่สอง ที่จริงแล้วฉันได้ทำ. / config และสร้างคำสั่งแล้ว ทุกอย่างทำงานได้ดี แต่เมื่อฉันได้ทิป "ติดตั้ง" ฉันได้รับข้อความข้อผิดพลาดว่า: ติดตั้ง: ตัวถูกดำเนินการแฟ้มที่ขาดหายไป

ดูเพิ่มเติมที่: raspberrypi.stackexchange.com/q/14587/5538ฉันปิดมันในฐานะคู่หู แต่ฉันคิดว่ามันคุ้มค่าที่จะเชื่อมโยงที่นี่เพราะคำตอบที่ยอมรับนั้นมีรายละเอียดมากมายไม่รวมอยู่ที่นี่
goldilocks

คำตอบ:


60

ฉันพบคำแนะนำเหล่านี้วิธีสร้าง cross compiler สำหรับ Raspberry Pi ของคุณ มันเป็นการเดินผ่านที่ยอดเยี่ยมโดยใช้crosstool-ngเครื่องมือที่ทำให้การสร้าง cross-compiler build A ล็อตง่ายขึ้น (มันมีอินเตอร์เฟซที่อิงกับคำสาปที่ดี) และรองรับ GCC 4.7

ฉันได้ทำตามขั้นตอนเหล่านี้และจบลงด้วยการสร้างคอมไพเลอร์ข้าม 4.7 ที่ประสบความสำเร็จ

วิชาบังคับก่อน:แพคเกจดังต่อไปนี้จำเป็นต้องใช้: กระทิง , เฟล็กซ์ , gperf , เพ่งพิศ , libtool , automake , กรัม ++ให้แน่ใจว่าเหล่านี้จะถูกติดตั้งก่อนที่จะดำเนินการต่อ

  1. ดาวน์โหลดครั้งแรกcrosstool-ngจากที่นี่ (ฉันใช้รุ่น 1.15.2)
  2. แกะกระจายและทำ./configure/ make/install
  3. สร้างไดเรกทอรีใหม่ที่ไหนสักแห่งในระบบไฟล์เพื่อสร้างและcdเข้าสู่มัน
  4. ct-ng menuconfigวิ่ง คุณจะได้รับการนำเสนอพร้อมชุดเมนูที่ดีในการกำหนดค่าการสร้าง
  5. ไปที่ตัวเลือก Paths และอื่น ๆ เปิดใช้งานคุณลักษณะลองทำเครื่องหมายเป็น EXPERIMENTAL
  6. เลือกที่เหมาะสมไดเรกทอรีคำนำหน้า นี่คือไดเรกทอรีที่คอมไพเลอร์และไลบรารี่ของคุณจะได้รับการติดตั้ง (ทุกอย่างดีเป็นพื้นฐานเพียงตรวจสอบให้แน่ใจว่าไดเรกทอรีนั้นว่างเปล่า)

    • หมายเหตุ:สิ่งสำคัญคือคุณต้องมีสิทธิ์ในการเขียนเข้าไปยังโฟลเดอร์ที่เลือก
  7. ไปที่เมนูตัวเลือกเป้าหมาย

    • สถาปัตยกรรมเป้าหมาย: แขน
    • Endianness: endian น้อย
    • พยาน: 32 บิต
  8. คุณอาจต้องการตั้งค่าพารามิเตอร์ floating point เป็นsoftfp (ดูที่นี่สำหรับข้อมูลเพิ่มเติม) แต่hardfpเหมาะสมกว่าสำหรับ Raspbian

  9. ไปที่ระบบปฏิบัติการเมนูและเปลี่ยนเป้าหมาย OSเพื่อลินุกซ์
  10. ไปที่เมนูคอมไพเลอร์ Cและเลือก gcc เวอร์ชั่น 4.7.0 (บทความแนะนำให้ Linaro แต่ฉันจัดการเพื่อให้มันทำงานกับ vanilla gcc) เลือกภาษาเพิ่มเติมที่คุณต้องการรวบรวม (C ++, Fortran, ... )
  11. ไปที่เมนูC-libraryและเลือกหนึ่งรายการ ค่าเริ่มต้นคือeglibcแต่อันนี้ไม่ได้สร้างมาให้ฉันดังนั้นฉันจึงใช้glibc (รุ่นใหม่ล่าสุด)

    • หมายเหตุ:ระหว่างการสร้างขั้นตอนที่ 13 eglibcสามารถล้มเหลวในการสร้างหากไม่ได้ติดตั้งการโค่นล้มเนื่องจากแหล่งข้อมูลไม่สามารถเรียกคืนได้จากที่เก็บ
    • หมายเหตุ: eglibcไม่ได้เป็นส่วนหนึ่งของเวอร์ชั่น 1.21.0 อีกต่อไปเนื่องจากไม่มีการพัฒนา ดูยาวเพื่อ eglibc ใช้glibcเป็นค่าเริ่มต้น crosstool-ng
  12. ออกจากเครื่องมือกำหนดค่าในขณะที่บันทึกการเปลี่ยนแปลงของคุณ
  13. ทำงานct-ng buildในไดเรกทอรีเดียวกัน รอสักครู่ (ประมาณ 45 นาทีในกรณีของฉัน) และคอมไพเลอร์ไขว้ของคุณควรพร้อม

ดูเหมือนว่าจะทำงานได้ดี!


ว้าว 45 นาทีเป็นเวลานาน ระบบของคุณเร็วแค่ไหน? ฉันกำลังรออยู่
Jivings

บางทีมันอาจจะน้อยไปหน่อย แต่ก็ต้องรวบรวมสิ่งที่จำเป็นทั้งหมดก่อนและหลังจาก bintools และ gcc ก็มี libc และ libstdc ++ ดังนั้น 45 นาทีฟังดูสมเหตุสมผลสำหรับฉัน

เราสามารถเพิ่มรายละเอียดเกี่ยวกับวิธีการติดตั้งเหล่านี้อย่างถูกต้องและอัปเดตเส้นทางเมื่อทดสอบแล้วได้หรือไม่
อเล็กซ์แชมเบอร์เลน

2
นอกจากนี้ฉันคิดว่าเราควรใช้ hardfp เนื่องจาก RPi รองรับ
อเล็กซ์แชมเบอร์เลน

อาจเป็นได้ แต่ IIRC GCC ของ Arch ได้รับการกำหนดค่าด้วย softfp ตอนนี้ฉันยังไม่มีเวลาทดสอบ แต่ฉันได้สร้างคำตอบให้กับชุมชนวิกิดังนั้นโปรดอย่าลังเลที่จะปรับปรุง

19

ฉันกระตือรือร้นที่จะรวบรวมและฉันต้องการใช้เครื่องมือใหม่ล่าสุดและดีที่สุด

ที่จริงแล้วเครื่องมือล่าสุดและดีที่สุดไม่จำเป็นต้องสร้างขึ้นด้วยตัวเอง ในRaspberry Pi Tool GitHub RepositoryคุณจะพบX86_64และx686toolchains สำหรับซอฟต์แวร์การคอมไพล์ข้าม

ฉันแนะนำให้ใช้x86-linux64-cross-arm-linux-hardfptoolchain เนื่องจากจะรวบรวมจุดแข็งของ Floating Floating ซึ่งจะทำให้ระบบเร็วขึ้น

$ arm-bcm2708hardfp-linux-gnueabi-gcc --version

arm-bcm2708-linux-gnueabi-gcc-4.5.1 (Broadcom-2708) 4.5.1
Copyright (C) 2010 Free Software Foundation, Inc.

หมายเหตุ:หากคุณใช้เคอร์เนลที่มีอยู่คุณจะต้องใช้ toolchain ที่ตรงกับเคอร์เนล แอปพลิเคชัน HardFP จะไม่ทำงานบนเคอร์เนล SoftFP


ในการใช้ Toolchain เพียงตรวจสอบที่เก็บ:

git clone https://github.com/raspberrypi/tools.git --depth 1

--depthพารามิเตอร์จะหมายความว่าคุณจะได้ไม่ต้องรอให้พื้นที่เก็บข้อมูลประวัติให้ดาวน์โหลดเช่นกัน (ตั้งแต่ที่เราเคยชินจะใช้มัน)

จากนั้นเพิ่มไบนารีในตัวแปร PATH ของคุณ:

export PATH=~/tools/arm-bcm2708/x86-linux64-cross-arm-linux-hardfp/bin:$PATH

หรือเพื่อคงเส้นทาง:

echo "export PATH=~/tools/arm-bcm2708/x86-linux64-cross-arm-linux-hardfp/bin:$PATH" >> ~/.bashrc
source ~/.bashrc

เพื่อรวบรวมกับกลุ่มเครื่องมือคุณสามารถเพิ่มCROSS_COMPILEพารามิเตอร์ได้ ตัวอย่างเช่นเมื่อทำงานmake:

make CROSS_COMPILE=arm-bcm2708hardfp-linux-gnueabi- 

หรือเพื่อให้ง่ายขึ้นคุณสามารถบันทึกตัวแปรbashrcอีกครั้ง:

echo "export TARGET=arm-bcm2708hardfp-linux-gnueabi" >> ~/.bashrc
source ~/.bashrc

และตอนนี้ใช้ตัวแปรเมื่อรวบรวม:

make CROSS_COMPILE=${TARGET}

1
นี่น่าจะเป็น gcc-4.5.1

@Tibor มันไม่ดีเหรอ?
Jivings

@Jivings มันทั้งหมดไม่ตอบคำถาม!
อเล็กซ์แชมเบอร์เลน

1
ฉันไม่อนุมัติ downvote @AlexChamberlain มันแนะนำวิธีการที่มีคุณค่าทางเลือกให้กับการกระทำที่ใช้เวลานานในการสร้าง toolchain ของคุณเอง
Jivings

2
@Jivings: สิ่งนี้มีประโยชน์มาก ในขณะเดียวกันก็คือ gcc4.7.1 (ดีที่สุดที่ฉันเคยมี) และจุดลอยทำงานได้ทันที ฉันไม่สามารถทำให้จุดลอยตัวทำงานได้โดยใช้คำอธิบายดั้งเดิมของ Chris ที่ Tibor โพสต์ ขอบคุณมาก ๆ.

4

โปรดทราบว่าเมื่อสร้าง toolchain โดยใช้ ct-ng บน centos 6.3 บนระบบ 64 บิตฉันถูกบังคับให้ยกเลิกการเลือกตัวเลือกเพื่อเชื่อมโยงแบบคงที่ libstdc ++ เนื่องจากการเชื่อมโยงแบบสแตติกไม่ได้รับการสนับสนุนบนแพลตฟอร์ม

ยิ่งไปกว่านั้นแม้ว่าการใช้ toolchain ที่สร้างไว้ล่วงหน้าจากแหล่งเก็บข้อมูล git นั้นเป็นเรื่องที่ยอดเยี่ยม แต่เชนนั้นดูเหมือนจะไม่ทำงานบน Centos 6.3 - อาจเป็นเพราะมันถูกสร้างขึ้นสำหรับระบบที่ทันสมัยกว่าหรือบางสิ่งบางอย่าง ฉันไม่ได้พยายามทำให้เรื่องนี้แย่ลง



3

หากคุณต้องการได้รับประโยชน์จากโฮสต์ที่รวดเร็วสำหรับการรวบรวมสิ่งต่าง ๆ สำหรับ RPI ของคุณฉันแนะนำให้ทำงานในสภาพแวดล้อมข้ามผ่าน chroot และ QEMU โดยวิธีนี้แทนที่คอมไพเลอร์ข้ามที่ไม่มีความยุ่งยาก

เพียงแค่ติดตั้ง Debian cross-environment โดยใช้deboostrap / multistrap

(ดูที่บท QEMU / debootstrap) และคุณทำเสร็จแล้ว


3

ในกรณีที่คุณกำลังจะทำการคอมไพล์จาก OS X: นี่เป็นบทความที่ยอดเยี่ยม (และเป็นสิ่งเดียวที่ทำงานบนเว็บที่ฉันพบ)

สิ่งที่ยิ่งใหญ่ที่สุดคือผู้เขียนมอบเครื่องมือprecompiled ที่สมบูรณ์ดังนั้นคุณจะต้องดาวน์โหลด, คลายซิปและเมานต์ภาพ dmg และนั่นคือคุณพร้อมที่จะคอมไพล์แล้ว


2

หากคุณติดตั้ง Ubuntu 64 bits edition และเครื่องมือจาก Raspberry Pi SVN และคุณได้รับข้อผิดพลาด:

-bash: /home/I/toolchain/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-c++: 
No such file or directory

เพิ่งรัน:

sudo apt-get install ia32-libs

1

Carlson-Minot Inc. เป็นเครื่องมือที่สร้างไว้ล่วงหน้าสำหรับเป้าหมาย ARM ทั้งโลหะเปลือยและ GNU / Linux Toolchain นี้อ้างอิงจาก Toolchain ของ Mentor Graphics Sourcery Lite พร้อมด้วยการแก้ไขและการปรับใช้สำหรับการสร้างบน OS X ดู

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.