Come modificare il compilatore GCC predefinito in Ubuntu?


95

Ho installato gcc-3.3 / g ++ - 3.3 su ubuntu 11.04 che ha già gcc / g ++ - 4.4. Quindi nel mio sistema sono disponibili sia gcc-3.3 che 4.4. Posso chiamare entrambi i compilatori come voglio. Se chiamo solo il comando gcc, verrà chiamato gcc-4.4. Per chiamare gcc-3.3, devo usare il comando gcc-3.3.

Come posso cambiare il compilatore predefinito come gcc-3.3? Quando eseguo il comando gccdovrebbe chiamare gcc-3.3 e non gcc-4.4.

Inoltre, come posso modificare la variabile CXX in un file make in gcc-3.3? Vorrei cambiare una posizione globale comune nel sistema invece di cambiare tutti i file make.


2
Per il flag CXX puoi invocare CXX=gcc-3.3o export CXX=gcc-3.3e poi makecomunque quando lo hai cambiato globalmente con update-alternativesesso userà già gcc-3.3 e questo non è necessario.
DipSwitch

1
@ RoboAlex: aggiornato di nuovo la mia risposta per tenere conto della tua richiesta della variabile d'ambiente CXX. Tuttavia, tieni presente che servirà solo nel caso in cui modifichi le alternative di aggiornamento in un secondo momento.
jopasserat

Hai solo bisogno di cambiare il tuo PERCORSO. La maggior parte delle risposte menziona il sistema delle alternative, ma sia i manutentori di Debian che di LLVM concordano sul fatto che il sistema delle alternative dovrebbe essere usato per le alternative , NON per il controllo delle versioni . Spiegato ulteriormente nella mia risposta.
hmijail piange le dimissioni il

Risposte:


112

Come suggerito da @Tommy, dovresti usare update-alternatives.
Assegna valori a ogni software di una famiglia, in modo da definire l'ordine in cui verranno chiamate le applicazioni.

Viene utilizzato per mantenere diverse versioni dello stesso software su un sistema. Nel tuo caso, potrai utilizzare diverse declinazioni di gcce una sarà favorita.

Per capire le priorità attuali di gcc, digita il comando indicato dal commento di @ tripleee:

update-alternatives --query gcc

Ora, nota la priorità attribuita a gcc-4.4perché dovrai assegnarne una più alta a gcc-3.3.
Per impostare le tue alternative, dovresti avere qualcosa del genere (supponendo che la tua gccinstallazione si trovi in /usr/bin/gcc-3.3e gcc-4.4la priorità di è inferiore a 50) :

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-3.3 50

--modificare--

Infine, puoi anche utilizzare l'interfaccia interattiva di update-alternativesper passare facilmente da una versione all'altra. Digita update-alternatives --config gcca cui ti viene chiesto di scegliere la versione di gcc che desideri utilizzare tra quelle installate.

- modifica 2 -

Ora, per correggere la variabile di ambiente CXX a livello di sistema, devi inserire la riga indicata da @ DipSwitch nel tuo .bashrcfile (questo applicherà la modifica solo per il tuo utente, che è più sicuro secondo me):

echo 'export CXX=/usr/bin/gcc-3.3' >> ~/.bashrc

1
@thang ha anche chiamato cc:root@host:/root# update-alternatives --get-selections | grep '/usr/bin/gcc' cc auto /usr/bin/gcc
jopasserat

Quando
eseguo

come hai potuto farlo automaticamente però? ciò richiede un passaggio manuale per controllare l'output di update-alternatives --query gcc, che potrebbe non funzionare ad esempio in uno script di provisioning automatizzato. Inoltre, come può essere reso indipendente dalla piattaforma?
ely

68

Ecco un esempio completo della risposta di jHackTheRipper per il pubblico TL; DR. :-) In questo caso, volevo eseguire g ++ - 4.5 su un sistema Ubuntu il cui valore predefinito è 4.6. Come root:

apt-get install g++-4.5
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 100
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.5 50
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 100
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.5 50
update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.6 100
update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.5 50
update-alternatives --set g++ /usr/bin/g++-4.5
update-alternatives --set gcc /usr/bin/gcc-4.5
update-alternatives --set cpp-bin /usr/bin/cpp-4.5

Qui, 4.6 è ancora l'impostazione predefinita (nota anche come "modalità automatica"), ma passo esplicitamente a 4.5 temporaneamente (modalità manuale). Per tornare alla 4.6:

update-alternatives --auto g++
update-alternatives --auto gcc
update-alternatives --auto cpp-bin

(Notare l'uso di cpp-bininvece di solo cpp. Ubuntu ha già cppun'alternativa con un collegamento principale di /lib/cpp. Rinominare quel collegamento rimuoverebbe il /lib/cppcollegamento, il che potrebbe interrompere gli script.)


8
Per la persona pigra del futuro che cerca di impostare il compilatore g ++ - 5 installato come predefinito:sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100
imallett

Rimane solo una domanda: perché APT non lo farà durante l'installazione del g++-6pacchetto?
rustyx

Ho cambiato il compilatore predefinito in g ++ - 5 in questo modo, ma usa ancora le librerie standard g ++ - 7, e ora ricevo errori con __builtincose non definite .
Youda008

22

Questa è l'ottima descrizione e le istruzioni dettagliate su come creare e gestire alternative master e slave (gcc e g ++).

In breve è:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7
sudo update-alternatives --config gcc

cosa c'è con il 40 e il 60. Sto cercando di usare gcc-6.
Nyxee

@nyxee 40 e 60 indicano la priorità assegnata a ciascuna voce, controlla le altre risposte per maggiore completezza sull'argomento
jopasserat

10

Tra 4.8 e 6 con tutto --slaves:

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 \
                    10 \
                    --slave   /usr/bin/cc cc /usr/bin/gcc-4.8 \
                    --slave   /usr/bin/c++ c++ /usr/bin/g++-4.8 \
                    --slave   /usr/bin/g++ g++ /usr/bin/g++-4.8 \
                    --slave   /usr/bin/gcov gcov /usr/bin/gcov-4.8 \
                    --slave   /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-4.8 \
                    --slave   /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-4.8 \
                    --slave   /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.8 \
                    --slave   /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.8 \
                    --slave   /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.8

e

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 \
                    15 \
                    --slave   /usr/bin/cc cc /usr/bin/gcc-6 \
                    --slave   /usr/bin/c++ c++ /usr/bin/g++-6 \
                    --slave   /usr/bin/g++ g++ /usr/bin/g++-6 \
                    --slave   /usr/bin/gcov gcov /usr/bin/gcov-6 \
                    --slave   /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-6 \
                    --slave   /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-6 \
                    --slave   /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-6 \
                    --slave   /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-6 \
                    --slave   /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-6

Cambia tra di loro con update-alternatives --config gcc.


2
funziona bene dopo la rimozione cce le c++ righe, che causano un errore: l'alternativa cc non può essere slave di gcc: è un'alternativa master
palik

7

Ora è disponibile gcc-4.9 per Ubuntu / precise.

Crea un gruppo di alternative al compilatore in cui il compilatore della distro ha una priorità più alta:

root$ VER=4.6 ; PRIO=60
root$ update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
root$ update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-$VER $PRIO

root$ VER=4.9 ; PRIO=40
root$ update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
root$ update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-$VER $PRIO

NOTA: la versione g ++ viene modificata automaticamente con un cambio di versione gcc. cpp-bin deve essere fatto separatamente poiché esiste un'alternativa principale "cpp".

Elenca le alternative disponibili per il compilatore:

root$ update-alternatives --list gcc
root$ update-alternatives --list cpp-bin

Per selezionare manualmente la versione 4.9 di gcc, g ++ e cpp, fai:

root$ update-alternatives --config gcc
root$ update-alternatives --config cpp-bin

Controlla le versioni del compilatore:

root$ for i in gcc g++ cpp ; do $i --version ; done

Ripristina le impostazioni del compilatore della distro (qui: torna alla v4.6):

root$ update-alternatives --auto gcc
root$ update-alternatives --auto cpp-bin

2

Ho riscontrato questo problema durante il tentativo di installare un nuovo compilatore clang. Risulta che sia i manutentori di Debian che quelli di LLVM concordano sul fatto che il sistema delle alternative dovrebbe essere usato per le alternative, NON per il controllo delle versioni .

La soluzione che propongono è qualcosa del genere:
PATH=/usr/lib/llvm-3.7/bin:$PATH
dove /usr/lib/llvm-3.7/bin è una directory creata dal pacchetto llvm-3.7, e che contiene tutti gli strumenti con i loro nomi senza suffisso. Detto questo, llvm-config (versione 3.7) appare con il suo nome semplice nel tuo PATH. Non c'è bisogno di perdere tempo con i collegamenti simbolici, né di chiamare llvm-config-3.7 che è stato installato in / usr / bin.

Inoltre, controlla un pacchetto denominato llvm-defaults (o gcc-defaults), che potrebbe offrire un altro modo per farlo (non l'ho usato).


Ottima soluzione! Lo uso per selezionare tra le suite "gcc" personalizzate
Mad Calm il

1

Nel caso in cui desideri un modo più rapido (ma comunque molto pulito) per ottenerlo per uno scopo personale (ad esempio se vuoi costruire un progetto specifico con alcuni forti requisiti riguardanti la versione del compilatore), segui i seguenti passaggi:

  • digitare echo $PATHe cercare una directory personale con una priorità molto alta (nel mio caso, l'ho ~/.local/bin);
  • aggiungi i link simbolici in questa directory:

Per esempio:

ln -s /usr/bin/gcc-WHATEVER ~/.local/bin/gcc
ln -s /usr/bin/g++-WHATEVER ~/.local/bin/g++

Naturalmente, questo funzionerà per un singolo utente (non è una soluzione a livello di sistema), ma d'altra parte non mi piace cambiare troppe cose nella mia installazione.


Quindi stai creando il tuo sistema di alternative ad hoc, parallelo al sistema. Perché non usare la cosa reale?
hmijail piange i dimessi il

@hmijail Come ho spiegato, uso in questo modo quando voglio creare un progetto molto singolo senza rovinare l'intera installazione. Funziona molto bene e posso rimuoverlo facilmente dopo.
Thomas Baruchel

1
La semplice modifica del PATH sarebbe più veloce, più pulita e manterrebbe sincronizzati tra loro gli strumenti relativi a gcc.
hmijail piange i dimessi il

0

Ho usato solo le righe seguenti e ha funzionato. Volevo solo compilare VirtualBoxe VMWare WorkStationutilizzare kernel 4.8.10su Ubuntu 14.04. Inizialmente, la maggior parte delle cose non funzionava, ad esempio la grafica e il networking. Sono stato fortunato a VMWare workstationrichiederlo gcc 6.2.0. Non ho potuto avviare il mio Genymotion Android emulatorsperché virtualbox era inattivo. Pubblicheremo i risultati più tardi, se necessario.

VER=4.6 ; PRIO=60
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
VER=6 ; PRIO=50
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
VER=4.8 ; PRIO=40
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-$VER $PRIO --slave /usr/bin/g++ g++ /usr/bin/g++-$VER
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.