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.