So legen Sie gcc 4.8 als Standard-gcc-Compiler fest

27

Ich habe vor kurzem gcc 4.8mit brewauf installiert OSX 10.7.5 (Lion). Ich kann jetzt mithilfe gcc 4.8von kompilieren

g++-4.8 some_file.c

oder verwenden Sie die Standardeinstellung gcc 4.2mit

g++ some_file.c

Ich möchte gcc 4.8als Standard-Compiler verwenden Xcodeund wenn ich gccam Terminal tippe. Ich nehme an, ich muss die gcc-relatedLinks innerhalb ändern dirname $(which gcc).

Wenn ich es tue

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

Ich bekomme folgendes:

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

Wenn ich renne, which gcc-4.8bekomme ich /usr/local/bin/gcc-4.8.

Schritte, um dies zu erreichen, wären sehr hilfreich.

Bitte und Dankeschön.

quine
quelle
1
Gibt es einen Grund, den überlegenen llvm-Klang nicht zu verwenden?
Max Ried
Nicht speziell. Was ist der Vorteil von llvm clang im Vergleich zu Vanille gcc?
Quine
3
Es ist zwar schneller, bietet aber auch aussagekräftige Warnungen, ein wirklich wertvolles Feature, das gcc überhaupt nicht bietet.
Max Ried
Aha. Ist clang 3.3das entspricht gcc 4.8? Ich glaube, ich kann brew installes auch.
Quine
Erste Frage ist , re Klirren , warum können Sie nicht die Klirren mit Xcode geliefert verwenden , anstatt gcc-4.8 - dann könnten wir von clang3.3 beantworten funktionieren würde
user151019

Antworten:

20

Angenommen, Sie verwenden bash (dies ist die Standardeinstellung), dann können Sie / usr / local / bin als oberste Priorität in PATH wie folgt hinzufügen:

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

Dadurch wird sichergestellt, dass / usr / local / bin vor allen anderen Bereichen Ihres Pfades überprüft wird. Starten Sie dann einfach eine neue Terminalsitzung, um die neue Variable zu laden.

Ein anderer Weg dies zu tun:

  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++
Digitalchild
quelle
Mein Denkpfad enthält bereits usr/local/bin. echo $PATHenthüllt: / 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
Eine weitere Option wurde hinzugefügt
Digitalchild
1
Ja, es enthält es, aber es steht hinter / usr / bin, sodass es nicht zuerst gelesen wird. PATH ist sequentiell.
Digitalchild
1
Beide Optionen scheinen bei mir nicht zu funktionieren. Ich bin umgezogen, /usr/local/binum 1. in zu erscheinen PATH- was keinen Effekt hatte - gccschaut noch zu. gcc 4.2Ich habe dann die Symlinks manuell erstellt, aber wenn ich ein neues Terminalfenster öffne und g++oder ( cc|c++|gcc) werden nicht alle gefunden. Seltsam. Vielen Dank für Ihre Hilfe
quine
3
Ich würde nicht empfehlen, innerhalb /usr/bineines Unix zu spielen (welches MacOS X ist) ... es sei denn, Sie sind ein Spezialist, der an den Quellen einer neuen Version der nächsten Unix-Version arbeitet ☺.
Dan
19

Ich danke Ihnen allen für Ihre Hilfe. Am Ende habe ich nur Aliase ~/.bash_profilewie folgt erstellt:

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

Die Antwort von Lynken ist sehr hilfreich, aber ich habe sie mit Alias ​​angepasst, da ich sie bei Bedarf leichter rückgängig machen kann.

Insbesondere, wenn PATHso eingestellt ist, dass /usr/local/bin(wo Brew den Link setzt gcc 4.8) vor dem Erscheinen erscheint /usr/bin(wo gccstandardmäßig verlinkt ist), sollte das Erstellen von Links, wie von Lyken vorgeschlagen, /usr/local/bintheoretisch für mich funktionieren. In der Praxis ist dies aus irgendeinem Grund nicht der Fall. Wenn ein Linkerfehler auftritt und Aliase diesen Fehler umgehen, muss ich auch dieses Problem nicht lösen.

Der andere Vorteil von Aliasen ist, dass ich nicht verknüpfen muss, was Homebrew verarbeiten soll, und nicht mit dem Tool konkurrieren muss, für das die Version von gcc verknüpft ist /usr/local

quine
quelle
Möglicherweise müssen Sie dies für jede neue Binärdatei ändern, in der Sie installieren /usr/local/bin. Möglicherweise sind auch andere Binärdateien installiert und ausgeblendet, da die Position /usr/local/binin Ihrem PATH nicht stimmt. Bitte denken Sie noch einmal an meine Antwort, sie greift Ihr echtes Problem einmal, richtig und für immer an.
Dan
Recht. Vorhin habe ich Lyken gegenüber erwähnt, dass ich mich verändert PATHund /usr/local/binvor allem gestellt habe. Ich gebe zu, dass Ihre Aussage korrekt ist und dass ich sie ändern musste PATH, aber (in meinem Fall - dh bei der Standardinstallation brewvon gcc 4.8) rufe ich immer noch nicht gcc 4.8standardmäßig auf, wenn ich anrufe, gccda es standardmäßig keinen Symlink zwischen den beiden gibt. Ich musste es wie oben manuell erstellen.
Quine
Ich würde sagen, es ist so unterschiedlich, dass es seine eigene Antwort ist. Ich würde Ihre Antwort jedoch als gelöst markieren.
Digitalchild
Ok - danke Lyken. Ich werde es tun, sobald das System es mir erlaubt.
Quine
1
Ich habe es auch mit Alias ​​versucht, aber es funktioniert nur dann richtig, wenn Sie gccdirekt vom Terminal ausgeführt werden. Wenn Sie ein Makefile verwenden, das clangimmer noch verwendet wird, habe ich dieses Problem nur bei Verwendung einer Compiler-Option gefunden, die nur in verfügbar ist gcc.
Tien Do
11

Ich benutze zu 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

und zurück zu 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

oder legen Sie es in die Datei und dann: source <file>

ydk2
quelle
1

Nehmen wir an, Ihre eigentliche Shell-Initialisierung ist abgeschlossen ~/.profile, und Sie müssen sie so ändern, dass sie /usr/local/binvor jeder anderen PATH-Komponente steht, in der sich gccalle zugehörigen Binärdateien befinden.

So führen Sie diese bereinigte Änderung durch:

CD

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

if ["$ {_ shell_init}" = ""]; dann
    # PATH ist in .profile nicht definiert
    # installiere dort die erste relative Definition von PATH
    echo 'PATH = / usr / local / bin: $ {PATH}
exportiere PATH '>>. profile
    . .Profil
    exec $ {SHELL}
sonst
    # entferne alle Vorkommen von / usr / local / bin, wo immer sie auch sein mögen
    # in PATH setzen und vor allen anderen Komponenten einfügen
    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.neues .profil
    . .Profil
    exec $ {SHELL}
fi

Achtung: Wenn Ihr ~/.profileSkript bereits strukturiert ist, muss es manuell angepasst werden, um die richtige PATH-Definition an der richtigen Stelle zu finden.

Dan
quelle
Dies ist sicherlich perfekt zum Ändern, PATHso dass /usr/local/binzuerst gesehen wird. Dies wird mir wahrscheinlich in Zukunft Kopfschmerzen ersparen. Ich wünschte, ich könnte dir +1 geben. Mein Problem ist jedoch, dass gccimmer noch ein Link zu gcc 4.2und nicht, gcc 4.8weil es keinen Symlink für gcc -> gcc-4.8in gibt /usr/local/bin. Ich müsste nach dem Update mit Ihrem Skript immer noch entweder einen Alias gccals gcc-4.8in ~/.profileoder symlink ( ln -s gcc-4.8 gcc) in verwenden . Ihr? /usr/local/binPATH
Quine
Ich bin überrascht, brewdass ich nicht die richtigen symbolischen Links hinzugefügt habe. Haben Sie diese Antwort zum selben Thema gelesen: apple.stackexchange.com/a/38247/22003 ?
Dan
0

Es wird davon ausgegangen, dass beim Erstellen eines Alias ​​oder beim Verknüpfen mit verschiedenen gcc-Binärdateien ein eigenes Include verwendet wird, bevor der Standard-Include-Ordner des Systems verwendet wird.

Drachengeboren
quelle