Come cambiare il compilatore GCC predefinito in Ubuntu?

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. Sono in grado di chiamare entrambi i compilatori come voglio. Se chiamo semplicemente il comando gcc, verrà chiamato gcc-4.4. Per chiamare gcc-3.3, devo usare il comando gcc-3.3 .

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

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

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

È usato per mantenere diverse versioni dello stesso software su un sistema. Nel tuo caso, sarai in grado di usare diverse declinazioni di gcc , e una sarà favorita.

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

 update-alternatives --query gcc 

Ora, nota la priorità attribuita a gcc-4.4 perché devi dare una versione più alta a gcc-3.3 .
Per impostare le tue alternative, dovresti avere qualcosa del genere (supponendo che l’installazione di gcc si trovi in /usr/bin/gcc-3.3 , e la priorità di gcc-4.4 sia inferiore a 50) :

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

–modificare–

Infine, puoi anche utilizzare l’interfaccia intertriggers di update-alternatives per passare facilmente da una versione all’altra. Digitare update-alternatives --config gcc da chiedere di scegliere la versione gcc che si desidera utilizzare tra quelle installate.

–edit 2 –

Ora, per sistemare la variabile d’ambiente CXX a livello di sistema, devi mettere la linea indicata da @ DipSwitch nel tuo file .bashrc (questo applicherà la modifica solo per il tuo utente, che secondo me è più sicuro):

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

Ecco un esempio completo della risposta di jHackTheRipper per il pubblico di TL; DR. 🙂 In questo caso, volevo eseguire g ++ – 4.5 su un sistema Ubuntu che per impostazione predefinita era 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 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 

(Si noti l’uso di cpp-bin invece di solo cpp Ubuntu ha già un’alternativa cpp con un link principale di /lib/cpp . Rinominando quel collegamento si rimuove il collegamento /lib/cpp , che potrebbe interrompere gli script.)

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

A 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 

Ora, gcc-4.9 è disponibile per Ubuntu / preciso.

Crea un gruppo di alternative del 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 di g ++ viene cambiata automaticamente con uno switch di versione gcc. cpp-bin deve essere fatto separatamente in quanto esiste un’alternativa “cpp” master.

Elenca alternative di compilazione disponibili:

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

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

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

Verifica le versioni del compilatore:

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

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

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

Tra il 4,8 e il 6 con tutti gli --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 .

Ho trovato questo problema durante il tentativo di installare un nuovo compilatore clang. Risulta che entrambi i manutentori Debian e LLVM concordano sul fatto che il sistema alternativo 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 non suffissi. Con ciò, llvm-config (versione 3.7) appare con il suo nome semplice nel PATH. Non c’è bisogno di andare in giro con i collegamenti simbolici, né di chiamare il llvm-config-3.7 che è stato installato in / usr / bin.

Inoltre, cerca un pacchetto chiamato llvm-defaults (o gcc-defaults), che potrebbe offrire un altro modo per farlo (non l’ho usato).

Nel caso in cui si desideri un metodo più rapido (ma ancora molto pulito) per ottenerlo per uno scopo personale (ad esempio se si desidera creare un progetto specifico con alcuni requisiti importanti relativi alla versione del compilatore), attenersi alla seguente procedura:

  • digita echo $PATH e cerca una directory personale con una priorità molto alta (nel mio caso, 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++ 

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

Ho usato solo le linee di seguito e ha funzionato. Volevo solo compilare VirtualBox e VMWare WorkStation usando il kernel 4.8.10 su Ubuntu 14.04 . Inizialmente, la maggior parte delle cose non funzionava, ad esempio grafica e networking. Sono stato fortunato che la VMWare workstation richiesto gcc 6.2.0 . Non ho potuto avviare gli Genymotion Android emulators perché Genymotion Android emulators non Genymotion Android emulators . Pubblicherà 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