Varsayılan gcc derleyicisi olarak gcc 4.8 nasıl ayarlanır


27

Geçenlerde yüklü gcc 4.8kullanarak brewüzerinde OSX 10.7.5 (Lion). Şimdi kullanarak gcc 4.8kullanarak derleyebilirsiniz

g++-4.8 some_file.c

veya kullanarak varsayılanı gcc 4.2kullanma

g++ some_file.c

Kullanmak istediğim gcc 4.8için varsayılan derleyici olarak Xcodeben yazarsanız ve gccterminalde. Sanırım gcc-relatediçindeki bağlantıları değiştirmeliyim dirname $(which gcc).

Ben yaparken

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

Aşağıdakileri alıyorum:

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

Koşarken: which gcc-4.8Anladım /usr/local/bin/gcc-4.8.

Bunu başarmak için atılacak adımlar çok yardımcı olacaktır.

Lütfen ve teşekkür ederim.


1
Üstün llvm clang'ı kullanmamak için herhangi bir sebep var mı?
Max Ried

Spesifik değil. Llvm clang'ın vanilya gcc'ye kıyasla faydası nedir?
quine

3
Daha hızlı olmasının yanı sıra anlamlı uyarılar da sunarken, gerçekten değerli bir gcc de tamamen yoksundur.
Max Ried

Anlıyorum. Mı clang 3.3denk gcc 4.8? Ben brew installde yapabildiğime inanıyorum .
Quine

Sorulacak ilk soru size ziyade Xcode ile verilen clang neden kullanamazsınız yeniden çınlama olduğunu gcc-4.8 - o zaman işe yarar clang3.3 ait cevap verebilir
user151019

Yanıtlar:


20

Bash kullandığınızı varsayarsak (varsayılandır), ardından PATH'de / usr / local / bin komutunu birinci sıradaki gibi ekleyebilirsiniz:

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

Bu, / usr / local / bin öğesinin yolunuzun diğer tüm alanlarından önce kontrol edilmesini sağlayacaktır. Ardından yeni değişkeni yüklemek için yeni bir terminal oturumu başlatın.

Bunu yapmanın başka bir yolu:

  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++

Benim düşünce yolum zaten içeriyor usr/local/bin. echo $PATHşunu gösterir: / opt / local / bin: / opt / yerel / sbin: / opt / local / dahil: / 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

Başka bir seçenek eklendi
Digitalchild

1
Evet onu içerir, ancak / usr / bin'den sonradır, bu nedenle ilk önce okunmaz. PATH sıralıdır.
Digitalchild

1
Her iki seçenek de benim için çalışmıyor gibi görünüyor. /usr/local/bin1'i görünmek için hareket ettim PATH- etkisi yoktu - çağrı gcchala görünüyor. gcc 4.2Sonra işaretleri manuel olarak yarattım, ancak yeni bir terminal penceresi açtığımda ve g++(veya cc|c++|gcc) hepsi bulunamadı. Garip. Yardımınız için teşekkürler
Ağustos'ta

3
Bir /usr/binsonraki Unix sürüm ☺'nun yeni bir sürümünün kaynakları üzerinde çalışan bir uzman değilseniz, herhangi bir Unix'in içinde oynamayı tavsiye etmem (MacOS X).
dan

19

Yardımlarınız için hepinize teşekkürler. ~/.bash_profileAşağıdaki gibi sadece takma adlar oluşturdum :

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

Lynken'in cevabı çok yardımcı oldu, fakat gerektiğinde geri almam daha kolay olduğu için takma isimlerle uyarladım.

Özellikle, eğer PATHöyle ayarlanır /usr/local/bin(demlemek koyar bağlantı nerede gcc 4.8) görünmeden önce görünür /usr/bin(burada gccvarsayılan olarak bağlantılıdır) içinde, LYKEN olarak daha sonra oluştururken bağlantılar önerdi /usr/local/binbenim için teorik olarak çalışma gerekir. Uygulamada, bir nedenden ötürü - bir linker hatası ve takma ad ile başarısız olmak, bu sorunu da çözmek zorunda kalmadan bu hatanın etrafında çalışır.

Takma adların bir başka yararı da, hangi web sunucusunun kullanmasını istediğim ile bağlantı kurmak zorunda olmadığım ve gcc sürümünün bağlantılı olduğu araçla rekabet etmek zorunda olmamamdır. /usr/local


Bunu, içine kuracağınız yeni bir ikili dosya için değiştirmeniz gerekebilir /usr/local/bin. PATH'nizin kötü konumlandırması nedeniyle başka ikili dosyalar da yüklenmiş ve gizli olabilir /usr/local/bin. Lütfen cevabımı bir kez daha düşünün, gerçek sorununuza bir kez, doğru ve sonsuza kadar saldırıyor.
dan

Sağ. Daha önce Lyken'e değiştirdiğimden PATHve /usr/local/binher şeyden önce koyduğumdan bahsettim . İfadenizin doğru olduğunu ve değiştirmem gerektiğini kabul ediyorum PATH, ancak (benim durumumda - yani varsayılan brewkurulum gcc 4.8) Aradığımda gcc 4.8varsayılan olarak aramayacağım gccçünkü ikisi arasında varsayılan olarak bir bağlantı yok. Yukarıda yaptığım gibi manuel olarak oluşturmak zorunda kaldım.
quine

Kendi cevabı olacak kadar farklı diyebilirim, cevabınızı yine de çözülmüş olarak işaretlerdim.
Digitalchild

Tamam - teşekkürler Lyken. Sistem bunu yapmama izin verir vermez yapacağım.
quine

1
Takma adı da denedim, ancak yalnızca gccdoğrudan terminalden çalışırsanız düzgün çalışır . Bir makefile kullanıyorsanız clang, hala kullanılıyorsa, bu sorunu yalnızca içinde bulunan bir derleyici seçeneğini kullanırken buldum gcc.
Tien

11

Ben gcc-4.8 kullanıyorum:

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

ve tekrar elmalı gcc'ye:

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

veya dosyaya koyun ve sonra: source <file>


1

Gerçek kabuk başlatma işleminizin gerçekleştirildiğini varsayalım ~/.profile, sonra onu ve tüm ilişkili ikili dosyalarının /usr/local/binbulunduğu herhangi bir PATH bileşeninin önüne koymak için değiştirmek zorunda kalacaksınız gcc.

İşte bu temiz değişikliği gerçekleştirmenin yolu:

CD

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

eğer ["$ {_ shell_init}" = ""]; sonra
    # PATH .profile içinde tanımlanmadı
    # orada PATH ilk göreceli tanımı yükleyin
    yankı 'PATH = / usr / yerel / kutu: $ {PATH}
PATH '>> ürününü dışa aktar
    . .profil
    exec $ {SHELL}
Başka
    # / usr / local / bin öğesinin tüm oluşumlarını nerede olursanız olun kaldırın
    # PATH içine ayarlandı ve diğer tüm bileşenlerin önüne yerleştirin
    sed -E -e '/ (^ |) PATH = / s,: / usr / yerel / bin ,,' \
        -e '/ (^ |) PATH = / s, / usr / yerel / bin: ,,' \
        -e '/ (^ |) PATH = / s ,, & / usr / local / bin :,' .profile> .profile.new
    mv .profile.new .profile
    . .profil
    exec $ {SHELL}
fi

Dikkat: ~/.profilezaten yapılandırılmışsa, bu kabuk betiğinin doğru yere doğru PATH tanımına uyması için manuel olarak ayarlanması gerekir.


Bu kesinlikle ilk önce görüldüğü şekilde değiştirmek için mükemmeldir . Bu muhtemelen ileride başımı ağrıtacak. Keşke seni + 1'leyebilseydim. Sorunum olsa yani hala bağlı olduğu ve hiçbir sembolik link olmadığından içinde . Komut dosyanızı güncelledikten sonra , içinde olduğu gibi diğer adları veya symlink ( ) komutunu kullanmam gerekir. Ye? PATH/usr/local/bingccgcc 4.2gcc 4.8gcc -> gcc-4.8/usr/local/bingccgcc-4.8~/.profileln -s gcc-4.8 gcc/usr/local/binPATH
quine

Şaşırdım brew, doğru sembolik bağları eklemedim. Bu cevabı aynı konuda okudunuz mu : apple.stackexchange.com/a/38247/22003 ?
dan

0

Takma ad yapma veya farklı gcc ikili dosyalarına bağlanmanın varsayılan sistem include klasöründen önce kendi include'larını kullanmalarını sağlayacağı varsayılmaktadır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.