115 votes

Comment changer le compilateur GCC par défaut dans Ubuntu ?

J'ai installé gcc-3.3/g++-3.3 sur ubuntu 11.04 qui possède déjà gcc/g++-4.4. Ainsi, dans mon système, gcc-3.3 et 4.4 sont tous deux disponibles. Je suis capable d'appeler les deux compilateurs comme je le souhaite. Si j'appelle simplement la commande gcc alors gcc-4.4 sera appelé. Pour appeler gcc-3.3, je dois utiliser la commande gcc-3.3 .

Comment puis-je changer le compilateur par défaut en gcc-3.3 ? Lorsque j'exécute la commande gcc il devrait appeler la gcc-3.3 et non la gcc-4.4.

De plus, comment puis-je changer la variable CXX dans un fichier make pour gcc-3.3 ? Je souhaite changer un endroit global commun dans le système au lieu de changer tous les fichiers make.

2 votes

Pour le drapeau CXX, vous pouvez invoquer CXX=gcc-3.3 ou export CXX=gcc-3.3 et ensuite make Cependant, lorsque vous l'avez modifié globalement avec update-alternatives il utilisera déjà gcc-3.3 et ce n'est pas nécessaire.

1 votes

@RoboAlex : j'ai mis à jour ma réponse pour prendre en compte votre demande de variable d'environnement CXX. Cependant, veuillez noter que cela ne servira que dans le cas où vous modifiez les alternatives de mise à jour plus tard.

0 votes

Il vous suffit de modifier votre PATH. La plupart des réponses mentionnent le système alternatif, mais les mainteneurs de Debian et de LLVM sont d'accord pour dire que le système alternatif est le système le plus utilisé. alternatives doit être utilisé pour alternatives , PAS pour versioning . Plus d'explications dans ma réponse.

130voto

jopasserat Points 2839

Comme @Tommy l'a suggéré, vous devriez utiliser update-alternatives .
Il attribue des valeurs à chaque logiciel d'une famille, de sorte qu'il définit l'ordre dans lequel les applications seront appelées.

Il est utilisé pour maintenir différentes versions d'un même logiciel sur un système. Dans votre cas, vous pourrez utiliser plusieurs déclinaisons de gcc et l'un d'entre eux sera favorisé.

Pour connaître les priorités actuelles de gcc, tapez la commande indiquée par le commentaire de @tripleee :

update-alternatives --query gcc

Maintenant, notez la priorité attribuée à gcc-4.4 parce que vous devrez en donner un plus élevé pour gcc-3.3 .
Pour définir vos alternatives, vous devriez avoir quelque chose comme ceci (en supposant que votre gcc L'installation est située à /usr/bin/gcc-3.3 et gcc-4.4 La priorité de l'utilisateur est inférieure à 50) :

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

--edit--

Enfin, vous pouvez également utiliser l'interface interactive de l'application update-alternatives pour passer facilement d'une version à l'autre. Type update-alternatives --config gcc pour être invité à choisir la version de gcc que vous voulez utiliser parmi celles installées.

--edit 2 --

Maintenant, pour fixer la variable d'environnement CXX dans tout le système, vous devez mettre la ligne indiquée par @DipSwitch's dans votre fichier .bashrc (cela appliquera la modification uniquement pour votre utilisateur, ce qui est plus sûr à mon avis) :

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

1 votes

@thang également appelé cc : root@host:/root# update-alternatives --get-selections | grep '/usr/bin/gcc' cc auto /usr/bin/gcc

0 votes

Lorsque je lance la commande "update-alternatives --config gcc", rien ne se passe, même si j'ai le gcc du système et celui d'anaconda.

0 votes

Mais comment faire cela automatiquement ? Cela nécessite une étape manuelle pour vérifier la sortie de update-alternatives --query gcc qui pourrait ne pas fonctionner par exemple dans un script de provisionnement automatique. De plus, comment peut-on rendre cela agnostique à la plateforme ?

74voto

Trevor Robinson Points 3657

Voici un exemple complet de la réponse de jHackTheRipper pour les amateurs de TL;DR :-) Dans ce cas, je voulais exécuter g++-4.5 sur un système Ubuntu qui utilise la version 4.6 par défaut. Comme 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

Ici, 4.6 est toujours la valeur par défaut (alias "mode automatique"), mais je passe explicitement et temporairement à 4.5 (mode manuel). Pour revenir à la version 4.6 :

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

(Notez l'utilisation de cpp-bin au lieu de seulement cpp . Ubuntu possède déjà un cpp alternative avec un lien maître de /lib/cpp . Renommer ce lien permettrait de supprimer le /lib/cpp lien, ce qui pourrait casser les scripts).

8 votes

Pour les paresseux du futur qui essaient de définir le compilateur g++-5 installé comme compilateur par défaut : sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100

0 votes

Il ne reste qu'une seule question : pourquoi APT ne le fait pas lors de l'installation de la g++-6 paquet ?

0 votes

J'ai changé le compilateur par défaut pour g++-5 de cette façon, mais il utilise toujours les bibliothèques standard g++-7, et maintenant j'obtiens des erreurs avec undefined __builtin truc.

28voto

Anton K Points 761

Voici la grande description et des instructions pas à pas sur la façon de créer et de gérer les alternatives maître et esclave (gcc et g++).

Bientôt, ça l'est :

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

1 votes

c'est quoi ces 40 et 60. J'essaie d'utiliser gcc-6.

1 votes

@nyxee 40 et 60 indiquent la priorité attribuée à chaque entrée, vérifiez les autres réponses pour plus d'exhaustivité sur le sujet.

14voto

szotsaki Points 580

Entre 4,8 et 6 avec tous les --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

et

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

Passez de l'un à l'autre avec update-alternatives --config gcc .

3 votes

Fonctionne bien après la suppression cc y c++ lignes, qui provoquent une erreur : l'alternative cc ne peut pas être esclave de gcc : c'est une alternative maître

7voto

dileks Points 71

Maintenant, il y a gcc-4.9 disponible pour Ubuntu/precise.

Créez un groupe d'alternatives de compilateurs où le compilateur de distro a une priorité plus élevée :

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

NOTE : La version de g++ est changée automatiquement avec un changement de version de gcc. cpp-bin doit être fait séparément car il existe une alternative maître "cpp".

Liste des alternatives de compilateurs disponibles :

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

Pour sélectionner manuellement la version 4.9 de gcc, g++ et cpp, faites :

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

Vérifiez les versions du compilateur :

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

Restaurer les paramètres du compilateur de la distro (ici : retour à la v4.6) :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X