Jak ustawić gcc 4.8 jako domyślny kompilator gcc


27

Niedawno zainstalowano gcc 4.8używając brewna OSX 10.7.5 (Lion). Teraz mogę kompilować za gcc 4.8pomocą

g++-4.8 some_file.c

lub używając domyślnego gcc 4.2za pomocą

g++ some_file.c

Chcę użyć gcc 4.8jako domyślnego kompilatora Xcodei jeśli piszę gccna terminalu. Przypuszczam, że muszę zmienić gcc-relatedlinki wewnątrz dirname $(which gcc).

Kiedy robię

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

Dostaję następujące:

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

Kiedy biegnę: which gcc-4.8rozumiem /usr/local/bin/gcc-4.8.

Kroki, aby to zrobić, byłyby bardzo pomocne.

Proszę i dziękuję.


1
Czy jest jakiś powód, aby nie korzystać z lepszej wersji llvm?
Max Ried

Nie specjalnie. Jakie są zalety llvm clang w porównaniu do waniliowego gcc?
quine,

3
Chociaż jest szybszy, oferuje także znaczące ostrzeżenia, ale naprawdę cennej funkcji gcc brakuje całkowicie.
Max Ried

Widzę. Jest clang 3.3odpowiednikiem gcc 4.8? Wierzę, że też mogę brew install.
quine,

Pierwsze pytanie zadać to re dzyń dlaczego nie można użyć dostarczonego z Xcode szczęk zamiast gcc-4.8 - wtedy możemy odpowiedzieć z clang3.3 będzie działać
user151019

Odpowiedzi:


20

Zakładając, że używasz bash (jest to ustawienie domyślne), możesz dodać / usr / local / bin jako swój najwyższy priorytet w PATH w następujący sposób:

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

Zapewni to sprawdzenie / usr / local / bin przed wszystkimi innymi obszarami na twojej ścieżce. Następnie po prostu uruchom nową sesję terminala, aby załadować nową zmienną.

Inny sposób to zrobić:

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

Moja ścieżka myślenia już zawiera usr/local/bin. echo $PATHujawnia: / opt / local / bin: / opt / local / sbin: / opt / local / include: / 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 16.08.2013

Dodano kolejną opcję
Digitalchild

1
Tak, zawiera go, ale jest po / usr / bin, więc nie jest najpierw czytany. ŚCIEŻKA jest sekwencyjna.
Digitalchild

1
Obie opcje wydają się dla mnie nie działać. Przeniosłem się, /usr/local/binaby pojawić się jako pierwsze w PATH- co nie miało żadnego efektu - wywołanie gccwciąż patrzy na. gcc 4.2Następnie ręcznie utworzyłem dowiązania symboliczne, ale kiedy otwieram nowe okno terminala i / g++lub ( cc|c++|gcc) wszystkie nie zostają znalezione. Dziwne. Dzięki za pomoc
quine

3
Nie radzę grać w /usr/binżadnym Uniksie (którym jest MacOS X)… chyba że jesteś specjalistą pracującym nad źródłami nowej wersji kolejnej wersji Unixa ☺.
dn

19

Dziękuję wam wszystkim za pomoc. Skończyło się na tworzeniu aliasów w ~/.bash_profilenastępujący sposób:

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

Odpowiedź od Lynkena jest bardzo pomocna, ale dostosowałem ją do aliasów, ponieważ łatwiej jest mi ją cofnąć w razie potrzeby.

W szczególności, jeśli PATHjest ustawione tak, że /usr/local/bin(gdzie brew umieszcza link gcc 4.8) pojawia się przed /usr/bin( pojawia gccsię domyślnie link), to tworzenie linków zgodnie z sugestią Lykena /usr/local/binpowinno teoretycznie działać dla mnie. W praktyce nie robi to z jakiegoś powodu - błąd z błędem linkera i aliasy obejście tego błędu bez mojej potrzeby rozwiązania tego problemu.

Inną zaletą aliasów jest to, że nie muszę linkować, z którym chcę obsługiwać homebrew, i nie muszę konkurować z tym narzędziem, dla którego jest połączona wersja gcc /usr/local


Być może będziesz musiał to zmienić dla każdego nowego pliku binarnego, który zainstalujesz /usr/local/bin. Możesz także mieć zainstalowane i ukryte inne pliki binarne z powodu złego pozycjonowania /usr/local/binw ŚCIEŻCE. Zastanówcie się raz jeszcze nad moją odpowiedzią, która raz na zawsze atakuje twój prawdziwy problem.
dn

Dobrze. Wspomniałem wcześniej Lykenowi, że zmieniłem PATHi postawiłem /usr/local/binprzede wszystkim. Przyznaję, że twoje stwierdzenie jest poprawne i że muszę to zmienić PATH, ale (w moim przypadku - tj. Domyślna brewinstalacja gcc 4.8) nadal nie dzwonię gcc 4.8domyślnie, gdy dzwonię, gccponieważ domyślnie nie ma dowiązania symbolicznego między nimi. Musiałem ręcznie go utworzyć, tak jak powyżej.
quine,

Powiedziałbym, że jest wystarczająco inny, by być własną odpowiedzią, ale oznaczę twoją odpowiedź jako rozwiązaną.
Digitalchild

Ok - dzięki Lyken. Zrobię to, gdy tylko pozwoli mi na to system.
quine,

1
Próbowałem też aliasu, ale działa poprawnie tylko wtedy, gdy uruchamiasz gccbezpośrednio z terminala. Jeśli używasz makefile, clangjest nadal używany, ten problem znalazłem tylko przy użyciu opcji kompilatora dostępnej tylko w gcc.
Tien Do

11

Używam do 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

i powrót do 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

lub umieść go w pliku, a następnie: source <file>


1

Załóżmy, że twoja rzeczywista inicjalizacja powłoki została wykonana ~/.profile, wtedy będziesz musiał ją zmodyfikować, aby /usr/local/binwyprzedzić dowolny inny składnik PATH, gdzie gcci wszystkie powiązane z nim pliki binarne.

Oto sposób przeprowadzenia tej czystej modyfikacji:

Płyta CD

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

if ["$ {_ shell_init}" = ""]; następnie
    # ŚCIEŻKA nie jest zdefiniowana w .profile
    # zainstaluj tam pierwszą względną definicję ŚCIEŻKI
    echo 'PATH = / usr / local / bin: $ {PATH}
eksport ŚCIEŻKI >>. profil
    . .profil
    exec $ {SHELL}
jeszcze
    # usuń wszystkie wystąpienia / usr / local / bin, gdziekolwiek się znajdują
    # ustaw w PATH i wstaw go przed wszystkimi innymi komponentami
    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

Uwaga: jeśli masz ~/.profilejuż strukturę, ten skrypt powłoki będzie musiał zostać ręcznie dostrojony, aby dopasować poprawną definicję ŚCIEŻKI we właściwym miejscu.


Jest to z pewnością idealne do modyfikacji, PATHaby /usr/local/binzobaczyć to jako pierwsze. To prawdopodobnie uratuje mi bóle głowy w przyszłości. Chciałbym dać ci +1. Mój problem jest jednak, że gccnadal jest związana gcc 4.2, a nie gcc 4.8dlatego, że nie ma dla dowiązanie gcc -> gcc-4.8w /usr/local/bin. Nadal będę musiał albo użyć aliasu gccjako gcc-4.8w ~/.profileśrodku, albo symlink ( ln -s gcc-4.8 gcc) w /usr/local/binpo aktualizacji PATHze skryptu. Człek?
quine,

Dziwię się, brewże nie dodałem odpowiednich linków symbolicznych. Czy przeczytałeś tę odpowiedź na ten sam temat: apple.stackexchange.com/a/38247/22003 ?
dan

0

Zakłada się, że utworzenie aliasu lub połączenie z różnymi plikami binarnymi gcc spowoduje, że będą używać własnych plików dołączanych przed domyślnym folderem dołączania systemu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.