วิธีการตั้งค่า gcc 4.8 เป็นคอมไพเลอร์ gcc เริ่มต้น


27

ผมเพิ่งติดตั้งgcc 4.8ใช้ในbrew OSX 10.7.5 (Lion)ตอนนี้ฉันสามารถรวบรวมgcc 4.8โดยใช้

g++-4.8 some_file.c

หรือใช้ค่าเริ่มต้นgcc 4.2โดยใช้

g++ some_file.c

ฉันต้องการใช้gcc 4.8เป็นคอมไพเลอร์เริ่มต้นสำหรับXcodeและถ้าฉันพิมพ์gccที่เทอร์มินัล ฉันคิดว่าฉันจะต้องปรับเปลี่ยนการเชื่อมโยงภายในgcc-relateddirname $(which gcc)

เมื่อฉันทำ

ls -al $(dirname $(which gcc)) | grep 'gcc\|g++\|c++'

ฉันได้รับต่อไปนี้:

lrwxr-xr-x     1 root   wheel         7 Jul 31 12:17 c++ -> clang++
-rwxr-xr-x     1 root   wheel    909360 Nov 18  2011 c++filt
lrwxr-xr-x     1 root   wheel         5 Jul 31 12:17 clang++ -> clang
lrwxr-xr-x     1 root   wheel        12 Jul 31 12:17 g++ -> llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        12 Jul 31 12:17 gcc -> llvm-gcc-4.2
lrwxr-xr-x     1 root   wheel        28 Jul 31 12:17 gcov-4.2 -> ../llvm-gcc-4.2/bin/gcov-4.2
lrwxr-xr-x     1 root   wheel        52 Jul 31 12:17 i686-apple-darwin11-llvm-g++-4.2 -> ../llvm-gcc-4.2/bin/i686-apple-darwin11-llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        52 Jul 31 12:17 i686-apple-darwin11-llvm-gcc-4.2 -> ../llvm-gcc-4.2/bin/i686-apple-darwin11-llvm-gcc-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-cpp-4.2 -> ../llvm-gcc-4.2/bin/llvm-cpp-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-g++ -> ../llvm-gcc-4.2/bin/llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-g++-4.2 -> ../llvm-gcc-4.2/bin/llvm-g++-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-gcc -> ../llvm-gcc-4.2/bin/llvm-gcc-4.2
lrwxr-xr-x     1 root   wheel        32 Jul 31 12:17 llvm-gcc-4.2 -> ../llvm-gcc-4.2/bin/llvm-gcc-4.2

เมื่อผมทำงาน: ฉันจะได้รับwhich gcc-4.8/usr/local/bin/gcc-4.8

ขั้นตอนในการทำสิ่งนี้จะมีประโยชน์มาก

กรุณาและขอบคุณ


1
เหตุผลใดที่จะไม่ใช้เสียงดังกราว lvm ที่เหนือกว่า?
Max Ried

ไม่เฉพาะเจาะจง อะไรคือประโยชน์ของ llvm clang เมื่อเปรียบเทียบกับ vanilla gcc?
ควาย

3
ในขณะที่เร็วขึ้นมันยังมีคำเตือนที่มีความหมาย แต่ฟีเจอร์ที่ล้ำค่าจริง ๆ gcc ก็ยังขาดอยู่ทั้งหมด
Max Ried

ฉันเห็น. คือclang 3.3เท่ากับgcc 4.8? ฉันเชื่อว่าฉันสามารถทำได้brew installเช่นกัน
ควาย

คำถามแรกที่ถามคือเสียงดังกราวทำไมคุณไม่สามารถใช้เสียงดังกราวที่มาพร้อมกับ Xcode มากกว่า gcc-4.8 - จากนั้นเราสามารถตอบ clang3.3 ได้
user151019

คำตอบ:


20

สมมติว่าคุณใช้ bash (เป็นค่าเริ่มต้น) จากนั้นคุณสามารถเพิ่ม / usr / local / bin เป็นลำดับความสำคัญสูงสุดของคุณใน PATH ดังนี้:

echo "PATH=\"/usr/local/bin:$PATH\"" >> ~/.bash_profile

สิ่งนี้จะช่วยให้มั่นใจได้ว่ามีการตรวจสอบ / usr / local / bin ก่อนพื้นที่อื่น ๆ ทั้งหมดของเส้นทางของคุณ จากนั้นเพียงแค่เริ่มต้นเซสชันเทอร์มินัลใหม่เพื่อโหลดตัวแปรใหม่

อีกวิธีในการทำสิ่งนี้:

  cd /usr/bin
  rm cc gcc c++ g++
  ln -s /usr/local/bin/gcc-4.8 cc
  ln -s /usr/local/bin/gcc-4.8 gcc
  ln -s /usr/local/bin/c++-4.8 c++
  ln -s /usr/local/bin/g++-4.8 g++

usr/local/binเส้นทางที่คิดว่าฉันมีอยู่แล้ว echo $PATHเผยให้เห็น: / opt / local / bin: / opt / local / sbin: / opt / local / รวม: / usr / local / mysql / bin: / usr / bin / bjam: / usr / bin: / bin: / usr / sbin: / sbin: / usr / local / bin: / usr / X11 / bin: / usr / local / การเดินทาง / bin: / usr / texbin
ควิน

เพิ่มตัวเลือกอื่น
Digitalchild

1
ใช่มันมีอยู่ แต่หลังจาก / usr / bin ดังนั้นจึงไม่ได้รับการอ่านก่อน PATH เป็นแบบต่อเนื่อง
Digitalchild

1
ตัวเลือกทั้งสองดูเหมือนจะไม่ทำงานสำหรับฉัน ฉันย้าย/usr/local/binไปปรากฏตัวครั้งที่ 1 PATHซึ่งไม่มีผลใด ๆ - การโทรgccยังคงดูอยู่gcc 4.2ฉันจึงสร้าง symlink ด้วยตนเอง แต่เมื่อฉันเปิดหน้าต่างเทอร์มินัลใหม่และg++หรือ ( cc|c++|gcc) ไม่พบทั้งหมด แปลก. ขอบคุณสำหรับความช่วยเหลือของคุณ
ควิน

3
ฉันจะไม่แนะนำให้เล่นใน/usr/binUnix ใด ๆ (ซึ่งเป็น MacOS X) ... เว้นแต่คุณจะเป็นผู้เชี่ยวชาญที่ทำงานเกี่ยวกับแหล่งที่มาของเวอร์ชันใหม่ของ Unix เวอร์ชันถัดไป☺
แดน

19

ขอบคุณทุกท่านสำหรับความช่วยเหลือของคุณ ฉันสิ้นสุดเพียงสร้างนามแฝงภายใน~/.bash_profileดังนี้:

alias gcc='gcc-4.8'
alias cc='gcc-4.8'
alias g++='g++-4.8'
alias c++='c++-4.8'

คำตอบจาก Lynken มีประโยชน์มาก แต่ฉันปรับมันด้วยนามแฝงเนื่องจากมันง่ายสำหรับฉันที่จะเลิกทำในกรณีที่จำเป็น

โดยเฉพาะถ้าPATHตั้งไว้ว่า/usr/local/bin(ที่ชงวางลิงค์ไปgcc 4.8) จะปรากฏขึ้นก่อนที่จะปรากฏขึ้น/usr/bin(ที่gccมีการเชื่อมโยงโดยค่าเริ่มต้น) จากนั้นสร้างการเชื่อมโยงตามที่ Lyken แนะนำภายใน/usr/local/binควรทำงานในทางทฤษฎีสำหรับฉัน ในทางปฏิบัติมันไม่ได้ด้วยเหตุผลบางอย่าง - การล้มเหลวด้วยตัวเชื่อมโยงผิดพลาดและนามแฝงแก้ปัญหาข้อผิดพลาดนั้นโดยที่ฉันไม่ต้องแก้ไขปัญหานั้นด้วย

ประโยชน์อื่น ๆ ของนามแฝงคือฉันไม่ต้องเชื่อมโยงซึ่งฉันต้องการให้ homebrew จัดการและไม่ต้องแข่งขันกับเครื่องมือนั้นสำหรับรุ่น gcc ที่เชื่อมโยงด้วย /usr/local


/usr/local/binคุณอาจจะต้องเปลี่ยนนี้ไบนารีใหม่ที่คุณจะติดตั้งภายใน นอกจากนี้คุณยังอาจติดตั้งและซ่อนไบนารีอื่น ๆ เนื่องจากตำแหน่งที่ไม่ดี/usr/local/binภายใน PATH ของคุณ โปรดพิจารณาคำตอบของฉันอีกครั้งมันเป็นการโจมตีปัญหาที่แท้จริงของคุณอีกครั้งอย่างถูกต้องและตลอดไป
แดน

ขวา. ฉันพูดถึง Lyken ก่อนหน้านี้ว่าฉันเปลี่ยนแปลงPATHและวางไว้/usr/local/binก่อนหน้าทั้งหมด ฉันยอมรับว่าคำสั่งของคุณถูกต้อง & ที่ฉันต้องการแก้ไขPATHแต่ (ในกรณีของฉัน - คือการbrewติดตั้งเริ่มต้นgcc 4.8) ฉันจะยังคงไม่โทรgcc 4.8ตามค่าเริ่มต้นเมื่อฉันโทรgccเพราะไม่มี symlink ระหว่างสองค่าเริ่มต้น ฉันต้องสร้างมันเองเหมือนที่ฉันทำข้างต้น
quine

ฉันจะบอกว่ามันแตกต่างกันพอที่จะเป็นคำตอบของตัวเองฉันจะทำเครื่องหมายคำตอบของคุณว่าแก้ไข
Digitalchild

ตกลง - ขอบคุณ Lyken ฉันจะทำทันทีที่ระบบอนุญาตให้ทำเช่นนั้น
quine

1
ฉันลองใช้นามแฝงด้วย แต่จะทำงานได้อย่างถูกต้องหากคุณเรียกใช้gccโดยตรงจากเทอร์มินัล ถ้าคุณใช้ Makefile ที่ยังคงใช้มาผมพบเพียงปัญหานี้เมื่อใช้ตัวเลือกคอมไพเลอร์ที่ใช้ได้เฉพาะในclang gcc
Tien Do

11

ฉันใช้ gcc-4.8:

export CC=/usr/local/bin/gcc

export CXX=/usr/local/bin/g++

export CPP=/usr/local/bin/cpp

export LD=/usr/local/bin/gcc

alias c++=/usr/local/bin/c++

alias g++=/usr/local/bin/g++

alias gcc=/usr/local/bin/gcc

alias cpp=/usr/local/bin/cpp

alias ld=/usr/local/bin/gcc

alias cc=/usr/local/bin/gcc

และกลับสู่ apple gcc:

export CC=/usr/bin/gcc

export CXX=/usr/bin/g++

export CPP=/usr/bin/cpp

export LD=/usr/bin/ld

alias c++=/usr/bin/c++

alias g++=/usr/bin/g++

alias gcc=/usr/bin/gcc

alias cpp=/usr/bin/cpp

alias cc=/usr/bin/gcc

alias ld=/usr/bin/ld

หรือวางไว้ในไฟล์แล้ว: source <file>


1

สมมติว่าการเริ่มต้นเชลล์ที่แท้จริงของคุณเสร็จสิ้น~/.profileจากนั้นคุณจะต้องแก้ไขมันเพื่อนำ/usr/local/binหน้าส่วนประกอบ PATH อื่น ๆ ที่ใดgccและไบนารีที่เกี่ยวข้องทั้งหมดอยู่

นี่คือวิธีในการทำการปรับเปลี่ยนที่สะอาดนี้

ซีดี

_shell_init = `egrep '(^ |) PATH' .profile 2> / dev / null`

หาก ["$ {_ shell_init}" = ""]; แล้วก็
    # PATH ไม่ได้กำหนดไว้ใน. profile
    # ติดตั้งที่นั่นคำจำกัดความแรกของ PATH
    echo 'PATH = / usr / local / bin: $ {PATH}
ส่งออก PATH '>>. โปรไฟล์
    . .ข้อมูลส่วนตัว
    exec $ {SHELL}
อื่น
    # ลบเหตุการณ์ทั้งหมดของ / usr / local / bin ไม่ว่าพวกเขาจะอยู่ที่ไหน
    # ตั้งค่าเป็น PATH และแทรกไว้ข้างหน้าของส่วนประกอบอื่น ๆ ทั้งหมด
    sed -E -e '/ (^ |) PATH = / s,: / usr / local / bin ,,' \
        -e '/ (^ |) PATH = / s, / usr / local / bin: ,,' \
        -e '/ (^ |) PATH = / s ,, & / usr / local / bin:,' .profile> .profile.new
    mv .profile.new. profile
    . .ข้อมูลส่วนตัว
    exec $ {SHELL}
Fi

ระวัง: ถ้าคุณ~/.profileมีโครงสร้างอยู่แล้วเชลล์สคริปต์นี้จะต้องได้รับการปรับด้วยตนเองเพื่อให้พอดีกับคำสั่ง PATH ที่ถูกต้องในตำแหน่งที่ถูกต้อง


นี้เหมาะอย่างยิ่งสำหรับการปรับเปลี่ยนPATHเพื่อให้/usr/local/binเห็นเป็นครั้งแรก สิ่งนี้จะช่วยให้ฉันปวดหัวได้ในอนาคต ฉันหวังว่าฉันจะ +1 คุณ ปัญหาของฉันว่าเป็นที่gccยังคงมีการเชื่อมโยงไปgcc 4.2และไม่ได้gcc 4.8เพราะมี symlink ไม่มีในgcc -> gcc-4.8 /usr/local/binฉันยังคงต้องใช้นามแฝงgccว่าgcc-4.8ภายใน~/.profileหรือ symlink ( ln -s gcc-4.8 gcc) /usr/local/binหลังจากอัปเดตPATHด้วยสคริปต์ของคุณ เจ้า?
quine

ฉันประหลาดใจที่brewไม่ได้เพิ่มลิงก์สัญลักษณ์ที่ถูกต้อง คุณอ่านคำตอบนี้ในหัวข้อเดียวกัน: apple.stackexchange.com/a/38247/22003หรือไม่
และ

0

จะถือว่าการสร้างนามแฝงหรือการเชื่อมโยงไปยังไบนารี gcc ที่แตกต่างกันจะทำให้พวกเขาใช้การรวมของตัวเองก่อนที่โฟลเดอร์เริ่มต้นของระบบรวม

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