Cara mengatur gcc 4.8 sebagai kompiler gcc default

27

Saya baru saja menginstal gcc 4.8menggunakan brewpada OSX 10.7.5 (Lion). Saya sekarang dapat mengkompilasi menggunakan gcc 4.8dengan menggunakan

g++-4.8 some_file.c

atau menggunakan default gcc 4.2dengan menggunakan

g++ some_file.c

Saya ingin menggunakan gcc 4.8sebagai kompiler default untuk Xcodedan jika saya mengetik gccdi terminal. Saya kira saya harus mengubah gcc-relatedtautan di dalamnya dirname $(which gcc).

Kapan saya melakukannya

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

Saya mendapatkan yang berikut ini:

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

Ketika saya berlari: which gcc-4.8saya mengerti /usr/local/bin/gcc-4.8.

Langkah-langkah untuk menyelesaikan ini akan sangat membantu.

Silahkan dan terima kasih.

Quine
sumber
1
Ada alasan untuk tidak menggunakan dentang llvm superior?
Max Ried
Tidak secara spesifik. Apa manfaat dentang llvm dibandingkan dengan vanilla gcc?
quine
3
Meskipun lebih cepat juga menawarkan peringatan yang bermakna, fitur yang sangat berharga gcc tidak memiliki seluruhnya.
Max Ried
Saya melihat. Apakah clang 3.3setara dengan gcc 4.8? Saya percaya saya bisa brew installmelakukannya juga.
quine
Pertanyaan pertama yang perlu ditanyakan adalah ulang dentang mengapa Anda tidak dapat menggunakan dentang yang disediakan dengan Xcode daripada gcc-4.8 - maka kita bisa menjawab dentang3 akan berhasil
user151019

Jawaban:

20

Dengan asumsi Anda menggunakan bash (ini default), maka Anda dapat menambahkan / usr / local / bin sebagai prioritas utama Anda di PATH seperti ini:

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

Ini akan memastikan bahwa / usr / local / bin diperiksa sebelum semua area lain dari path Anda. Kemudian mulailah sesi terminal baru untuk memuat variabel baru.

Cara lain untuk melakukan ini:

  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++
Anak digital
sumber
Jalur pikiranku sudah berisi usr/local/bin. echo $PATHmengungkapkan: / opt / local / bin: / opt / local / sbin: / opt / local / termasuk: / usr / local / mysql / bin: / usr / bin / bjam: / usr / bin: / bin: / usr / sbin: / sbin: / usr / local / bin: / usr / X11 / bin: / usr / local / go / bin: / usr / texbin
quine
Menambahkan opsi lain
Digitalchild
1
Ya itu berisi tetapi setelah / usr / bin sehingga tidak bisa dibaca terlebih dahulu. PATH berurutan.
Digitalchild
1
Kedua opsi itu tampaknya tidak berhasil untuk saya. Saya pindah /usr/local/binke muncul 1 di PATH- yang tidak berpengaruh - panggilan gccmasih melihat. gcc 4.2Saya kemudian secara manual membuat symlink, tetapi ketika saya membuka jendela terminal baru dan g++atau ( cc|c++|gcc) semua tidak ditemukan. Aneh. Terima kasih atas bantuan Anda
quine
3
Saya tidak akan menyarankan untuk bermain di dalam /usr/binUnix apa pun (yang merupakan MacOS X) ... kecuali Anda seorang spesialis yang bekerja pada sumber-sumber versi baru dari versi Unix berikutnya ☺.
dan
19

Terima kasih atas bantuan Anda semua. Saya akhirnya hanya membuat alias di dalam ~/.bash_profilesebagai berikut:

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

Jawaban dari Lynken sangat membantu, tetapi saya mengadaptasinya dengan alias karena lebih mudah bagi saya untuk membatalkan jika perlu.

Secara khusus, jika PATHdiatur sedemikian rupa sehingga /usr/local/bin(tempat minuman menempatkan tautan gcc 4.8) muncul sebelum muncul /usr/bin(di mana gccditautkan secara default), maka membuat tautan seperti yang disarankan oleh Lyken /usr/local/binsecara teoritis seharusnya bekerja untuk saya. Dalam praktiknya, itu bukan karena suatu alasan - gagal dengan kesalahan linker dan alias mengatasi kesalahan itu tanpa saya perlu menyelesaikan masalah itu juga.

Manfaat lain dari alias adalah bahwa saya tidak harus menaut ke mana saya ingin menangani homebrew dan tidak harus bersaing dengan alat yang terhubung dengan versi gcc di /usr/local

Quine
sumber
Anda mungkin harus mengubah ini untuk biner baru yang akan Anda pasang di dalamnya /usr/local/bin. Anda mungkin juga memiliki binari lain yang diinstal dan disembunyikan karena posisi buruk /usr/local/bindalam PATH Anda. Harap pertimbangkan sekali lagi jawaban saya, itu menyerang masalah Anda yang sebenarnya sekali, dengan benar dan selamanya.
dan
Kanan. Saya memang menyebutkan sebelumnya kepada Lyken bahwa saya telah mengubah PATHdan menempatkan /usr/local/binsebelumnya. Saya mengakui bahwa pernyataan Anda benar & bahwa saya perlu mengubah PATH, tetapi (dalam kasus saya - yaitu brewinstalasi default gcc 4.8), saya masih tidak akan memanggil gcc 4.8secara default ketika saya menelepon gcckarena tidak ada hubungan antara keduanya secara default. Saya harus membuatnya secara manual seperti yang saya lakukan di atas.
quine
Saya akan mengatakan itu cukup berbeda untuk menjadi jawabannya sendiri, saya akan menandai jawaban Anda sudah terpecahkan.
Digitalchild
Ok - terima kasih Lyken. Saya akan segera setelah sistem memungkinkan saya untuk melakukannya.
quine
1
Saya mencoba alias juga tetapi hanya berfungsi dengan baik jika Anda menjalankan gcclangsung dari terminal. Jika Anda menggunakan makefile, clangmasih digunakan, saya hanya menemukan masalah ini ketika menggunakan opsi kompilator yang hanya tersedia di gcc.
Tien Do
11

Saya gunakan untuk 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

dan kembali ke apel 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

atau letakkan di file dan kemudian: source <file>

ydk2
sumber
1

Mari kita asumsikan inisialisasi shell aktual Anda selesai ~/.profile, maka Anda harus memodifikasinya agar dapat menempatkan /usr/local/binkomponen PATH lainnya di mana gccdan semua biner yang terkait berada.

Inilah cara untuk melakukan modifikasi bersih ini:

CD

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

jika ["$ {_ shell_init}" = ""]; kemudian
    # PATH tidak didefinisikan dalam profil
    # instal di sana definisi relatif pertama PATH
    echo 'PATH = / usr / local / bin: $ {PATH}
ekspor profil PATH '>>
    . .Profil
    exec $ {SHELL}
lain
    # hapus semua kejadian / usr / local / bin dimanapun mereka berada
    # set ke PATH, dan masukkan di depan semua komponen lainnya
    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
    . .Profil
    exec $ {SHELL}
fi

Hati-hati: jika Anda ~/.profilesudah terstruktur, skrip shell ini harus disetel secara manual agar sesuai dengan definisi PATH yang benar di tempat yang tepat.

dan
sumber
Ini tentu saja sempurna untuk memodifikasi PATHsehingga /usr/local/binterlihat lebih dulu. Ini kemungkinan akan menyelamatkan saya sakit kepala di masa depan. Saya berharap bisa memberi Anda +1. Masalah saya adalah apakah gccitu masih tertaut gcc 4.2dan bukan gcc 4.8karena tidak ada symlink untuk gcc -> gcc-4.8di /usr/local/bin. Saya masih perlu alias gccsebagai di gcc-4.8dalam ~/.profileatau symlink ( ln -s gcc-4.8 gcc) /usr/local/binsetelah memperbarui PATHdengan skrip Anda. Kamu?
quine
Saya terkejut brewtidak menambahkan tautan simbolik yang tepat. Apakah Anda membaca jawaban ini pada subjek yang sama: apple.stackexchange.com/a/38247/22003 ?
dan
0

Diasumsikan bahwa membuat alias atau menautkan ke binari gcc yang berbeda akan membuat mereka menggunakan include mereka sendiri sebelum folder system include default.

Dragonborn
sumber