ข้อจำกัดความรับผิดชอบ: ฉันค่อนข้างใหม่กับ Ubuntu ฉันมีประสบการณ์พอสมควรกับ RHEL และ SLES และต้องเรียนรู้เวอร์ชัน Ubuntu LTS เมื่อเร็ว ๆ นี้เนื่องจากฮาร์ดแวร์ ARM64 บางตัวที่ไม่ต้องการบูตอย่างอื่น
สรุป
แน่นอนว่า Ubuntu มักจะมาพร้อมกับส่วนประกอบบางอย่างจาก GCC ที่ใหม่กว่ากว่า GCC เริ่มต้นของรุ่นที่วางจำหน่าย เห็นได้ชัดว่าพวกเขาทำเช่นนี้เพื่อให้สามารถจัดเตรียมเวอร์ชันคอมไพเลอร์ที่ใหม่กว่าได้ ถ้า คุณต้องการใช้มัน
- แพ็คเกจ gcc-10-base ให้เอกสารประกอบเท่านั้น
- แพ็คเกจ libgcc-s1 มีไลบรารีที่สำคัญ
libgcc_s.so.1
. ที่ให้ฟังก์ชันตัวช่วยสำหรับรหัสที่สร้างโดยคอมไพเลอร์: ฉันรู้ว่ามันเป็นสิ่งสำคัญสำหรับการจัดการข้อยกเว้น C++ ที่ถูกโยนผ่าน C call stack
- ห้องสมุดที่สำคัญอีกแห่งคือ
libstdc++.so.6
. ที่ให้ฟังก์ชันสนับสนุน C++
- Glibc (
libc.so.6
, libm.so.6
และไลบรารีอื่นๆ) ก็มีความสำคัญเช่นกัน แต่ไม่เชื่อมโยงกับเวอร์ชัน GCC
ไลบรารีเหล่านี้ทั้งหมดมีกฎความเข้ากันได้ที่เข้มงวดมาก โดยพื้นฐานแล้ว เวอร์ชันที่ใหม่กว่าของไลบรารีจะเข้ากันได้กับเวอร์ชันก่อนหน้าเสมอ โดยเป็นส่วนลดเวอร์ชันเก่าบางเวอร์ชันจากประวัติช่วงต้นของ GCC และ Linux
ในตอนแรกไม่ชัดเจนว่าทำไม Ubuntu และ Debian จึงให้รันไทม์ที่ช้ากว่าคอมไพเลอร์ แต่จะชัดเจนขึ้นเมื่อคุณดูช่วงของเวอร์ชัน GCC ที่มีใน Ubuntu เวอร์ชัน LTS ล่าสุด:
การกระจาย เผยแพร่ Debian GCC รันไทม์ เริ่มต้น GCC GCC เพิ่มเติม
Ubuntu 16.04 เม.ย. 2559 9.x 5.x 5.4 4.7, 4.8, 4.9
Ubuntu 18.04 เม.ย. 2018 10.x 8.x 7.5 4.8, 5.5, 6.5 8.4
Ubuntu 20.04 เม.ย. 2020 11.x 9.x & 10.x 9.3 7.4, 8.4, 10.3
เมื่อถึงจุดนั้นมันจะชัดเจนพอสมควร Ubuntu 20.04 มีรันไทม์สำหรับโค้ดที่คอมไพล์ด้วย GCC 9.x และ 10.x (GCC 10.x ไม่ต้องการฟังก์ชันไลบรารีเพิ่มเติมใดๆ ที่ GCC 9.x ไม่ได้ใช้) คุณสามารถติดตั้งส่วนผสมของ GCC 7.4, 8.4 และ 10.3 เป็นคอมไพเลอร์เสริม และพวกมันทั้งหมดจะทำงานได้ ไลบรารีรันไทม์บน Ubuntu 20.04 จะรองรับโค้ดที่คอมไพล์ด้วยคอมไพเลอร์เหล่านั้น
ทำไมไม่จัดส่ง GCC 10.3 กับ Ubuntu 20.04 ไลบรารีรันไทม์โดยทั่วไปจะเสถียรกว่าคอมไพเลอร์ GCC 10 จะได้รับการเผยแพร่ครั้งแรก (เป็น 10.1) ในช่วงเวลาที่มีการรวบรวม 20.04 การสร้างรีลีส LTS ด้วยคอมไพเลอร์ใหม่ล่าสุดอาจเป็นเรื่องที่โง่เขลา จัดส่งไลบรารีรันไทม์ใหม่ หลังจากทดสอบด้วยโค้ดที่สร้างด้วย GCC 9 จะปลอดภัยกว่ามาก และอนุญาตให้เพิ่ม GCC 10 เมื่อเสถียรแล้ว
Canonical ไม่มี GCC 11 สำหรับ 20.04 เนื่องจากไม่มีเวลาทำงานที่จำเป็น คุณต้องใช้ Ubuntu รุ่นหลัง
จะหาสิ่งเหล่านี้ได้อย่างไร
/usr/share/doc/gcc/README.Debian
มีข้อมูลบางอย่าง และ Ununtu 20.04 ใช้ Debian 11 âBullseyeâ
dpkg-query --listfiles gcc-10-base
แสดงให้เราเห็นว่า gcc-10-base ให้เฉพาะเอกสารเท่านั้น
dpkg-แบบสอบถาม --listfiles libgcc-s1
แสดงให้เราเห็นว่า libgcc-s1 มีให้ /lib/x86_64-linux-gnu/libgcc_s.so.1
ซึ่งเป็นหนึ่งในไลบรารีรันไทม์พื้นฐานสำหรับ GCC
ไลบรารีรันไทม์พื้นฐานอื่นๆ สำหรับ C/C++ คือ glibc ซึ่งไม่ขึ้นกับ GCC และ libstdc++ dpkg-query -list | grep libstdc
แสดงให้เราเห็นสองแพ็คเกจ:
ii libstdc++-9-dev:amd64 9.3.0-17ubuntu1~20.04 amd64 GNU Standard C++ Library v3 ...
ii libstdc++6:amd64 10.3.0-1ubuntu1~20.04 amd64 GNU Standard C++ Library v3
libstdc++6
เป็นเวอร์ชัน GCC 10.3; เดอะ - พัฒนา
แพ็คเกจเป็นรุ่น GCC 9.3
dpkg-query --listfiles libstdc++-9-dev
แสดงให้เราเห็นว่าแพ็คเกจนี้มีไฟล์ส่วนหัว ไลบรารีไฟล์เก็บถาวร และเอกสารประกอบสำหรับการพัฒนาใน C++ ด้วย GCC 9
dpkg-แบบสอบถาม --listfiles libstdc++6
แสดงให้เราเห็นว่าแพ็คเกจนี้มีเอกสารประกอบ สคริปต์ Python และไฟล์สำคัญสองไฟล์:
/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28
เดอะ .so.6
ไฟล์คือสิ่งที่โปรแกรมเชื่อมโยงกับ มันเป็นซอฟต์ลิงค์ไปยัง .so.6.028
ไฟล์. นั่นคือชื่อของ libstdc++ เวอร์ชัน GCC 10 ซึ่งเป็นไลบรารีที่รองรับ GCC สำหรับ C++ คุณสามารถรับการแมประหว่างชื่อเหล่านั้นกับเวอร์ชัน GCC ที่นี่. เลื่อนลงมาแล้วคุณจะพบตาราง