จะเปลี่ยนคอมไพเลอร์ GCC เริ่มต้นใน Ubuntu ได้อย่างไร


98

ฉันติดตั้ง gcc-3.3 / g ++ - 3.3 บน ubuntu 11.04 ซึ่งมี gcc / g ++ - 4.4 อยู่แล้ว ดังนั้นในระบบของฉันจึงมีทั้ง gcc-3.3 และ 4.4 ฉันสามารถเรียกคอมไพเลอร์ทั้งสองได้ตามที่ฉันต้องการ ถ้าฉันแค่เรียกคำสั่งgccgcc-4.4 จะถูกเรียก ที่จะเรียก GCC-3.3 gcc-3.3ผมต้องใช้คำสั่ง

ฉันจะเปลี่ยนคอมไพเลอร์เริ่มต้นเป็น gcc-3.3 ได้อย่างไร เมื่อฉันรันคำสั่งgccควรเรียกใช้ gcc-3.3 ไม่ใช่ gcc-4.4

นอกจากนี้ฉันจะเปลี่ยนตัวแปร CXX ในไฟล์ make เป็น gcc-3.3 ได้อย่างไร ฉันต้องการเปลี่ยนตำแหน่งส่วนกลางที่พบบ่อยในระบบแทนที่จะเปลี่ยนไฟล์ make ทั้งหมด


2
ธง CXX คุณสามารถเรียกใช้CXX=gcc-3.3หรือexport CXX=gcc-3.3แล้วmakeแต่เมื่อคุณเปลี่ยนมันทั่วโลกที่มีupdate-alternativesอยู่แล้วจะใช้ GCC-3.3 และนี่คือไม่จำเป็น
DipSwitch

1
@RoboAlex: อัปเดตคำตอบของฉันอีกครั้งเพื่อพิจารณาคำขอตัวแปรสภาพแวดล้อม CXX ของคุณ อย่างไรก็ตามโปรดทราบว่าจะให้บริการในกรณีที่คุณแก้ไขทางเลือกในการอัปเดตในภายหลังเท่านั้น
jopasserat

คุณต้องเปลี่ยนเส้นทางของคุณเท่านั้น ส่วนใหญ่ตอบพูดถึงระบบทางเลือก แต่ทั้ง Debian และดูแล LLVM เห็นว่าทางเลือกของระบบควรจะใช้สำหรับทางเลือกไม่ได้สำหรับเวอร์ชัน อธิบายเพิ่มเติมในคำตอบของฉัน
hmijail ไว้อาลัยผู้ลาออก

คำตอบ:


114

ในฐานะที่เป็น @Tommy update-alternativesแนะนำคุณควรใช้
กำหนดค่าให้กับซอฟต์แวร์ทุกตัวในตระกูลเพื่อกำหนดลำดับที่จะเรียกใช้แอปพลิเคชัน

ใช้เพื่อบำรุงรักษาซอฟต์แวร์รุ่นเดียวกันในระบบ ในกรณีของคุณคุณจะสามารถใช้ declinations ได้หลายแบบgccและจะได้รับการสนับสนุนอย่างใดอย่างหนึ่ง

หากต้องการทราบลำดับความสำคัญปัจจุบันของ gcc ให้พิมพ์คำสั่งที่ระบุโดยความคิดเห็นของ @ tripleee:

update-alternatives --query gcc

ตอนนี้ทราบความสำคัญประกอบกับเพราะคุณจะต้องให้หนึ่งที่สูงขึ้นเพื่อgcc-4.4 ในการตั้งค่าทางเลือกอื่นคุณควรมีสิ่งนี้(สมมติว่าการติดตั้งของคุณอยู่ที่และลำดับความสำคัญน้อยกว่า 50) :gcc-3.3
gcc/usr/bin/gcc-3.3gcc-4.4

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-3.3 50

- แก้ไข -

สุดท้ายคุณยังสามารถใช้อินเทอร์เฟซแบบโต้ตอบupdate-alternativesเพื่อสลับระหว่างเวอร์ชันต่างๆได้อย่างง่ายดาย พิมพ์update-alternatives --config gccที่จะขอให้เลือกเวอร์ชัน gcc ที่คุณต้องการใช้ระหว่างที่ติดตั้ง

- แก้ไข 2 -

ตอนนี้เพื่อแก้ไขตัวแปรสภาพแวดล้อม CXX ทั้งระบบคุณต้องใส่บรรทัดที่ระบุโดย @ DipSwitch ใน.bashrcไฟล์ของคุณ(สิ่งนี้จะใช้การเปลี่ยนแปลงสำหรับผู้ใช้ของคุณเท่านั้นซึ่งปลอดภัยกว่าในความคิดของฉัน):

echo 'export CXX=/usr/bin/gcc-3.3' >> ~/.bashrc

1
@thang เรียกอีกอย่างว่าcc:root@host:/root# update-alternatives --get-selections | grep '/usr/bin/gcc' cc auto /usr/bin/gcc
jopasserat

เมื่อฉันเรียกใช้ 'ทางเลือกการอัปเดต --config gcc' ไม่มีอะไรเกิดขึ้นแม้ว่าฉันจะมี gcc และ anaconda ของระบบ
ก็ตาม

คุณจะทำสิ่งนี้โดยอัตโนมัติได้อย่างไร? สิ่งนี้ต้องใช้ขั้นตอนด้วยตนเองเพื่อตรวจสอบผลลัพธ์update-alternatives --query gccซึ่งอาจใช้ไม่ได้เช่นในสคริปต์การจัดเตรียมอัตโนมัติ นอกจากนี้สิ่งนี้จะทำให้แพลตฟอร์มไม่เชื่อเรื่องพระเจ้าได้อย่างไร?
ely

70

นี่คือตัวอย่างที่สมบูรณ์ของคำตอบของ jHackTheRipper สำหรับ TL; DR crowd :-) ในกรณีนี้ฉันต้องการเรียกใช้ g ++ - 4.5 บนระบบ Ubuntu ที่มีค่าเริ่มต้นเป็น 4.6 เป็นroot:

apt-get install g++-4.5
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 100
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.5 50
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 100
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.5 50
update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.6 100
update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.5 50
update-alternatives --set g++ /usr/bin/g++-4.5
update-alternatives --set gcc /usr/bin/gcc-4.5
update-alternatives --set cpp-bin /usr/bin/cpp-4.5

ที่นี่ 4.6 ยังคงเป็นค่าเริ่มต้น (หรือที่เรียกว่า "โหมดอัตโนมัติ") แต่ฉันเปลี่ยนไปใช้ 4.5 ชั่วคราวอย่างชัดเจน (โหมดแมนนวล) กลับไปที่ 4.6:

update-alternatives --auto g++
update-alternatives --auto gcc
update-alternatives --auto cpp-bin

(โปรดสังเกตการใช้cpp-binแทน just cppUbuntu มีcppทางเลือกอื่นที่มีลิงก์หลัก/lib/cppอยู่แล้วการเปลี่ยนชื่อลิงก์นั้นจะลบ/lib/cppลิงก์ซึ่งอาจทำให้สคริปต์เสียหายได้)


8
สำหรับคนขี้เกียจในอนาคตที่พยายามตั้งค่าคอมไพเลอร์ g ++ - 5 ที่ติดตั้งไว้เป็นค่าเริ่มต้น:sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100
imallett

มีคำถามเพียง 1 ข้อเท่านั้น: ทำไม APT ถึงไม่ทำเช่นนี้เมื่อติดตั้งg++-6แพ็คเกจ?
rustyx

ฉันเปลี่ยนคอมไพเลอร์เริ่มต้นเป็น g ++ - 5 ด้วยวิธีนี้ แต่ยังคงใช้ไลบรารีมาตรฐาน g ++ - 7 และตอนนี้ฉันได้รับข้อผิดพลาดกับ__builtinสิ่งที่ไม่ได้กำหนด
Youda008

23

นี่คือคำอธิบายที่ยอดเยี่ยมและคำแนะนำทีละขั้นตอนในการสร้างและจัดการทางเลือกหลักและทาส (gcc และ g ++)

ไม่นานก็คือ:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7
sudo update-alternatives --config gcc

คืออะไรกับ 40 และ 60 ฉันกำลังพยายามใช้ gcc-6
nyxee

@nyxee 40 และ 60 หมายถึงลำดับความสำคัญที่กำหนดให้กับแต่ละรายการตรวจสอบคำตอบอื่น ๆ เพื่อความครบถ้วนสมบูรณ์ของหัวข้อ
jopasserat

10

ระหว่าง 4.8 ถึง 6 โดยมีทั้งหมด--slaves:

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 \
                    10 \
                    --slave   /usr/bin/cc cc /usr/bin/gcc-4.8 \
                    --slave   /usr/bin/c++ c++ /usr/bin/g++-4.8 \
                    --slave   /usr/bin/g++ g++ /usr/bin/g++-4.8 \
                    --slave   /usr/bin/gcov gcov /usr/bin/gcov-4.8 \
                    --slave   /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-4.8 \
                    --slave   /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-4.8 \
                    --slave   /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.8 \
                    --slave   /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.8 \
                    --slave   /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.8

และ

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 \
                    15 \
                    --slave   /usr/bin/cc cc /usr/bin/gcc-6 \
                    --slave   /usr/bin/c++ c++ /usr/bin/g++-6 \
                    --slave   /usr/bin/g++ g++ /usr/bin/g++-6 \
                    --slave   /usr/bin/gcov gcov /usr/bin/gcov-6 \
                    --slave   /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-6 \
                    --slave   /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-6 \
                    --slave   /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-6 \
                    --slave   /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-6 \
                    --slave   /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-6

update-alternatives --config gccเปลี่ยนระหว่างพวกเขาด้วย


2
ทำงานได้ดีหลังจากลบccและc++ บรรทัดซึ่งทำให้เกิดข้อผิดพลาด: cc ทางเลือกไม่สามารถเป็นทาสของ gcc ได้: เป็นทางเลือกหลัก
palik

7

ตอนนี้มี gcc-4.9 สำหรับ Ubuntu / precision

สร้างกลุ่มของทางเลือกของคอมไพเลอร์ที่ distro compiler มีลำดับความสำคัญสูงกว่า:

root$ VER=4.6 ; PRIO=60
root$ update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
root$ update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-$VER $PRIO

root$ VER=4.9 ; PRIO=40
root$ update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
root$ update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-$VER $PRIO

หมายเหตุ:เวอร์ชัน g ++ จะเปลี่ยนโดยอัตโนมัติด้วยสวิตช์เวอร์ชัน gcc cpp-bin ต้องทำแยกกันเนื่องจากมีทางเลือกหลัก "cpp"

แสดงรายการทางเลือกของคอมไพเลอร์ที่มี:

root$ update-alternatives --list gcc
root$ update-alternatives --list cpp-bin

หากต้องการเลือกเวอร์ชัน 4.9 ของ gcc, g ++ และ cpp ด้วยตนเองให้ทำ:

root$ update-alternatives --config gcc
root$ update-alternatives --config cpp-bin

ตรวจสอบเวอร์ชันของคอมไพเลอร์:

root$ for i in gcc g++ cpp ; do $i --version ; done

คืนค่าการตั้งค่าคอมไพเลอร์ distro (ที่นี่: กลับไปที่ v4.6):

root$ update-alternatives --auto gcc
root$ update-alternatives --auto cpp-bin

3

ฉันพบปัญหานี้ขณะพยายามติดตั้งคอมไพเลอร์เสียงดังใหม่ ปรากฎว่าทั้งDebianและดูแล LLVM ยอมรับว่าระบบทางเลือกที่ควรจะใช้สำหรับทางเลือกไม่ได้สำหรับเวอร์ชัน

วิธีแก้ปัญหาที่พวกเขาเสนอมีดังนี้
PATH=/usr/lib/llvm-3.7/bin:$PATH
โดยที่ /usr/lib/llvm-3.7/bin เป็นไดเร็กทอรีที่สร้างขึ้นโดยแพ็กเกจ llvm-3.7 และมีเครื่องมือทั้งหมดที่มีชื่อที่ไม่มีคำต่อท้าย ด้วยเหตุนี้ llvm-config (เวอร์ชัน 3.7) จะปรากฏพร้อมชื่อธรรมดาในเส้นทางของคุณ ไม่จำเป็นต้องยุ่งกับ symlinks หรือเรียก llvm-config-3.7 ที่ติดตั้งใน / usr / bin

ตรวจสอบแพ็คเกจชื่อ llvm-defaults (หรือ gcc-defaults) ซึ่งอาจมีวิธีอื่นในการทำเช่นนี้ (ฉันไม่ได้ใช้)


ทางออกที่ยอดเยี่ยม! ฉันใช้มันเพื่อเลือกระหว่างห้องชุด "gcc" ที่สร้างขึ้นเอง
Mad Calm

1

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

  • พิมพ์echo $PATHและค้นหาไดเรกทอรีส่วนบุคคลที่มีลำดับความสำคัญสูงมาก (ในกรณีของฉันฉันมีไฟล์~/.local/bin )
  • เพิ่มลิงก์สัญลักษณ์ในไดเร็กทอรีนี้:

ตัวอย่างเช่น:

ln -s /usr/bin/gcc-WHATEVER ~/.local/bin/gcc
ln -s /usr/bin/g++-WHATEVER ~/.local/bin/g++

แน่นอนว่าสิ่งนี้ใช้ได้กับผู้ใช้คนเดียว (ไม่ใช่วิธีแก้ปัญหาทั้งระบบ) แต่ในทางกลับกันฉันไม่ชอบเปลี่ยนหลาย ๆ อย่างในการติดตั้งของฉัน


ดังนั้นคุณกำลังสร้างระบบทางเลือกเฉพาะกิจแบบขนานกับระบบของคุณเอง ทำไมไม่ใช้ของจริง
hmijail ไว้อาลัยผู้ลาออก

@hmijail ตามที่ฉันอธิบายไปฉันใช้วิธีนี้เมื่อฉันต้องการสร้างโปรเจ็กต์เดียวโดยไม่ทำให้การติดตั้งทั้งหมดยุ่งเหยิง มันใช้งานได้ดีมากและฉันสามารถลบออกได้อย่างง่ายดายในภายหลัง
Thomas Baruchel

1
เพียงแค่เปลี่ยนเส้นทางของคุณก็จะเร็วขึ้นสะอาดขึ้นและจะทำให้เครื่องมือที่เกี่ยวข้องกับ gcc ของคุณซิงค์กัน
hmijail ไว้อาลัยผู้ลาออก

0

ฉันใช้เพียงแค่บรรทัดด้านล่างและมันได้ผล ฉันแค่ต้องการรวบรวมVirtualBoxและVMWare WorkStationใช้kernel 4.8.10บนUbuntu 14.04. ในขั้นต้นสิ่งต่างๆส่วนใหญ่ไม่ทำงานเช่นกราฟิกและระบบเครือข่าย ผมโชคดีที่ขอVMWare workstation gcc 6.2.0ฉันไม่สามารถเริ่มได้Genymotion Android emulatorsเนื่องจาก virtualbox ไม่ทำงาน จะโพสต์ผลลัพธ์ในภายหลังหากจำเป็น

VER=4.6 ; PRIO=60
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
VER=6 ; PRIO=50
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
VER=4.8 ; PRIO=40
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.