Come impostare gcc 4.8 come compilatore gcc predefinito


27

Di recente ho installato gcc 4.8usando brewsu OSX 10.7.5 (Lion). Ora posso compilare usando gcc 4.8usando

g++-4.8 some_file.c

o usando il valore predefinito gcc 4.2usando

g++ some_file.c

Voglio usare gcc 4.8come compilatore predefinito per Xcodee se scrivo gccal terminale. Suppongo di dover modificare i gcc-relatedcollegamenti all'interno dirname $(which gcc).

Quando io faccio

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

Ottengo quanto segue:

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

Quando corro: which gcc-4.8ottengo /usr/local/bin/gcc-4.8.

I passaggi per farlo sarebbero molto utili.

Per favore e grazie.


1
Qualche motivo per non usare il clang llvm superiore?
Max Ried il

Non specificamente. Qual è il vantaggio di llvm clang rispetto a vanilla gcc?
1313

3
Pur essendo più veloce, offre anche avvisi significativi, una caratteristica davvero preziosa che manca a CCG.
Max Ried

Vedo. È clang 3.3l'equivalente di gcc 4.8? Credo di poterlo fare anch'io brew install.
1313

La prima domanda da porsi è re clang perché non puoi usare il clang fornito con Xcode invece di gcc-4.8 - allora potremmo rispondere di clang3.3 funzionerebbe
user151019

Risposte:


20

Supponendo che stai usando bash (è l'impostazione predefinita), quindi puoi aggiungere / usr / local / bin come priorità assoluta in PERCORSO in questo modo:

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

Questo assicurerà che / usr / local / bin sia controllato prima di tutte le altre aree del tuo percorso. Quindi basta avviare una nuova sessione terminale per caricare la nuova variabile.

Un altro modo per farlo:

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

Il mio percorso di pensiero contiene già usr/local/bin. echo $PATHrivela: / 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

Aggiunta un'altra opzione
Digitalchild

1
Sì, lo contiene ma dopo / usr / bin non viene letto per primo. PATH è sequenziale.
Digitalchild,

1
Entrambe le opzioni sembrano non funzionare per me. Mi sono trasferito /usr/local/binper apparire 1 ° in PATH- il che non ha avuto alcun effetto - la chiamata gccguarda ancora gcc 4.2. Ho quindi creato manualmente i collegamenti simbolici, ma quando apro una nuova finestra del terminale e g++o ( cc|c++|gcc) non vengono trovati tutti. Strano. Grazie per l'aiuto
Quine

3
Non consiglierei di giocare all'interno /usr/bindi alcun Unix (che è MacOS X) ... a meno che tu non sia uno specialista che lavora su fonti di una nuova versione della prossima versione di Unix ☺.
dan,

19

Grazie a tutti per il vostro aiuto. Ho finito per creare alias all'interno ~/.bash_profilecome segue:

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

La risposta di Lynken è molto utile, ma l'ho adattata con alias poiché è più facile per me annullare se necessario.

In particolare, se PATHè impostato in modo tale che /usr/local/bin(dove brew inserisce il collegamento gcc 4.8) appare prima /usr/bin(dove gccè collegato per impostazione predefinita), quindi la creazione di collegamenti come suggerito da Lyken /usr/local/bindovrebbe teoricamente funzionare per me. In pratica, non funziona per qualche motivo: fallire con un errore del linker e gli alias aggirano quell'errore senza che io abbia bisogno di risolvere anche quel problema.

L'altro vantaggio degli alias è che non devo collegare ciò che voglio gestire da homebrew e non dover competere con quello strumento per il quale è collegata la versione di gcc /usr/local


Potrebbe essere necessario modificarlo per ogni nuovo file binario che verrà installato all'interno /usr/local/bin. Potresti anche avere altri binari installati e nascosti a causa del cattivo posizionamento /usr/local/binall'interno del PERCORSO. Per favore, considera ancora una volta la mia risposta, sta attaccando il tuo vero problema una volta, correttamente e per sempre.
dan

Destra. Prima ho accennato a Lyken che ho modificato PATHe messo /usr/local/binprima di tutto. Ammetto che la tua affermazione è corretta e che dovevo modificare PATH, ma (nel mio caso - ovvero l' brewinstallazione predefinita di gcc 4.8) non chiamerò ancora gcc 4.8di default quando chiamo gccperché non esiste un collegamento simbolico tra i due per impostazione predefinita. Ho dovuto crearlo manualmente come ho fatto sopra.
Quin

Direi che è abbastanza diverso da essere la sua stessa risposta, tuttavia segnerei la tua risposta come risolta.
Digitalchild,

Ok - grazie Lyken. Lo farò non appena il sistema mi consente di farlo.
1313

1
Ho provato anche l'alias ma funziona correttamente solo se si esegue gccdirettamente dal terminale. Se si utilizza un makefile, clangviene ancora utilizzato, ho riscontrato questo problema solo quando si utilizza un'opzione del compilatore disponibile solo in gcc.
Tien Do,

11

Uso a 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

e ritorno a 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

oppure inseriscilo nel file e quindi: source <file>


1

Supponiamo che la tua effettiva inizializzazione della shell sia completata ~/.profile, quindi dovrai modificarla in modo da /usr/local/binanticipare qualsiasi altro componente PATH dove gcce tutti i binari associati.

Ecco il modo per eseguire questa modifica pulita:

CD

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

if ["$ {_ shell_init}" = ""]; poi
    # PATH non è definito in .profile
    # installa lì la prima definizione relativa di PATH
    echo 'PATH = / usr / local / bin: $ {PATH}
esporta PERCORSO '>>. profilo
    . .profilo
    exec $ {SHELL}
altro
    # rimuove tutte le occorrenze di / usr / local / bin ovunque si trovino
    # impostato in PATH e inserirlo prima di tutti gli altri componenti
    sed -E -e '/ (^ |) PATH = / s,: / usr / local / bin ,,' \
        -e '/ (^ |) PATH = / s, / usr / local / bin: ,,' \
        -e '/ (^ |) PERCORSO = / s ,, & / usr / local / bin :,' .profile> .profile.new
    mv .profile.new .profile
    . .profilo
    exec $ {SHELL}
fi

Attenzione: se il tuo ~/.profileè già strutturato, questo script di shell dovrà essere sintonizzato manualmente per adattarsi alla corretta definizione PATH nel posto giusto.


Questo è certamente perfetto per la modifica in PATHmodo che /usr/local/binsia visto per primo. Questo probabilmente mi farà risparmiare il mal di testa in futuro. Vorrei poterti fare +1. Il mio problema però è che gccè ancora collegato gcc 4.2e non gcc 4.8perché non esiste un collegamento simbolico per gcc -> gcc-4.8in /usr/local/bin. Avrei ancora bisogno di alias gcccome gcc-4.8all'interno ~/.profileo symlink ( ln -s gcc-4.8 gcc) /usr/local/bindopo l'aggiornamento PATHcon il tuo script. Voi?
Quin

Sono sorpreso che brewnon abbia aggiunto i giusti collegamenti simbolici. Hai letto questa risposta sullo stesso argomento: apple.stackexchange.com/a/38247/22003 ?
dan,

0

Si presume che la creazione di alias o il collegamento a diversi binari gcc li farà utilizzare la propria inclusione prima che il sistema predefinito includa la cartella.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.