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


95

J'ai installé gcc-3.3 / g ++ - 3.3 sur ubuntu 11.04 qui a déjà gcc / g ++ - 4.4. Donc, dans mon système, gcc-3.3 et 4.4 sont disponibles. Je peux appeler les deux compilateurs comme je veux. Si j'appelle simplement la commande, gccgcc-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, gccil doit appeler gcc-3.3 et non gcc-4.4.

De plus, comment puis-je changer la variable CXX dans un fichier make en gcc-3.3? Je souhaite changer une place globale commune dans le système au lieu de changer tous les fichiers make.


2
Pour le drapeau CXX, vous pouvez invoquer CXX=gcc-3.3ou export CXX=gcc-3.3et makecependant, lorsque vous l'avez modifié globalement, update-alternativesil utilisera déjà gcc-3.3 et ce n'est pas nécessaire.
DipSwitch

1
@RoboAlex: a de nouveau mis à jour ma réponse pour prendre en compte votre demande de variable d'environnement CXX. Cependant, veuillez noter qu'il ne servira que si vous modifiez les alternatives de mise à jour ultérieurement.
jopasserat

Il vous suffit de changer votre PATH. La plupart des réponses mentionnent le système d'alternatives, mais les responsables de Debian et de LLVM conviennent que le système d' alternatives devrait être utilisé pour des alternatives , PAS pour le contrôle de version . Plus expliqué dans ma réponse.
hmijail pleure les démissionnaires

Réponses:


112

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

Il est utilisé pour maintenir différentes versions du même logiciel sur un système. Dans votre cas, vous pourrez utiliser plusieurs déclinaisons de gcc, et une sera privilégiée.

Pour déterminer 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.4car vous devrez en donner une plus élevée gcc-3.3.
Pour définir vos alternatives, vous devriez avoir quelque chose comme ceci (en supposant que votre gccinstallation se trouve à /usr/bin/gcc-3.3, et que gcc-4.4la priorité soit inférieure à 50) :

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

--Éditer--

Enfin, vous pouvez également utiliser l'interface interactive de update-alternativespour basculer facilement entre les versions. Tapez update-alternatives --config gccpour être invité à choisir la version de gcc que vous souhaitez utiliser parmi celles installées.

--edit 2 -

Maintenant, pour corriger la variable d'environnement CXX à l'échelle du système, vous devez mettre la ligne indiquée par @ DipSwitch's dans votre .bashrcfichier (cela n'appliquera le changement que pour votre utilisateur, ce qui est plus sûr à mon avis):

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

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

Quand j'exécute le 'update-alternatives --config gcc', rien ne se passe, même si j'ai le système gcc et anaconda one
Kelthar

comment pourriez-vous faire cela automatiquement? cela nécessite une étape manuelle pour vérifier la sortie de update-alternatives --query gcc, ce qui peut ne pas fonctionner, par exemple dans un script d'approvisionnement automatisé. En outre, comment cela peut-il être rendu indépendant de la plate-forme?
ely le

68

Voici un exemple complet de la réponse de jHackTheRipper pour la foule TL; DR. :-) Dans ce cas, je voulais exécuter g ++ - 4.5 sur un système Ubuntu dont la valeur par défaut est 4.6. 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 (aka "mode auto"), mais je passe explicitement en 4.5 temporairement (mode manuel). Pour revenir à 4.6:

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

(Notez l'utilisation de cpp-binau lieu de juste cpp. Ubuntu a déjà une cppalternative avec un lien principal de /lib/cpp. Renommer ce lien supprimerait le /lib/cpplien, ce qui pourrait casser les scripts.)


8
Pour la personne paresseuse du futur essayant de définir le compilateur g ++ - 5 installé par défaut:sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100
imallett

Il ne reste qu'une seule question: pourquoi APT ne fait-il pas cela lors de l'installation du g++-6paquet?
rustyx

J'ai basculé le compilateur par défaut sur g ++ - 5 de cette façon, mais il utilise toujours les bibliothèques standard g ++ - 7, et maintenant j'obtiens des erreurs avec des __builtinéléments non définis .
Youda008

22

Ceci est la grande description et les instructions étape par étape pour créer et gérer des alternatives maître et esclave (gcc et g ++).

En bref c'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

ce qui est avec les 40 et 60. J'essaye d'utiliser gcc-6.
nyxee

@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
jopasserat

10

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

Changez entre eux avec update-alternatives --config gcc.


2
fonctionne bien après la suppression ccet les c++ lignes, ce qui provoque une erreur: l'alternative cc ne peut pas être esclave de gcc: c'est une alternative principale
palik

7

Désormais, gcc-4.9 est disponible pour Ubuntu / precise.

Créez un groupe d'alternatives au compilateur où le compilateur de distribution 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

REMARQUE: la version g ++ est modifiée automatiquement avec un commutateur de version gcc. cpp-bin doit être fait séparément car il existe une alternative maître "cpp".

Liste des alternatives de compilateur 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, procédez comme suit:

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

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

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

2

J'ai trouvé ce problème en essayant d'installer un nouveau compilateur clang. Il s'avère que les responsables de Debian et de LLVM conviennent que le système d'alternatives doit être utilisé pour des alternatives, PAS pour le contrôle de version .

La solution qu'ils proposent est quelque chose comme ceci:
PATH=/usr/lib/llvm-3.7/bin:$PATH
où /usr/lib/llvm-3.7/bin est un répertoire qui a été créé par le paquet llvm-3.7, et qui contient tous les outils avec leurs noms non suffixés. Avec cela, llvm-config (version 3.7) apparaît avec son nom clair dans votre PATH. Pas besoin de se faufiler avec les liens symboliques, ni d'appeler le llvm-config-3.7 qui a été installé dans / usr / bin.

Recherchez également un paquet nommé llvm-defaults (ou gcc-defaults), qui pourrait offrir un autre moyen de le faire (je ne l'ai pas utilisé).


Excellente solution! Je l'utilise pour sélectionner parmi les suites "gcc" personnalisées
Mad Calm

1

Si vous souhaitez un moyen plus rapide (mais toujours très propre) de le réaliser à des fins personnelles (par exemple, si vous souhaitez créer un projet spécifique ayant de fortes exigences concernant la version du compilateur), suivez simplement les étapes suivantes:

  • tapez echo $PATHet recherchez un répertoire personnel ayant une très haute priorité (dans mon cas, je l'ai ~/.local/bin);
  • ajoutez les liens symboliques dans ce répertoire:

Par exemple:

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

Bien sûr, cela fonctionnera pour un seul utilisateur (ce n'est pas une solution à l'échelle du système), mais d'un autre côté je n'aime pas changer trop de choses dans mon installation.


Vous créez donc votre propre système d'alternatives ad hoc, parallèle au système. Pourquoi ne pas utiliser la vraie chose?
hmijail pleure les démissionnaires

@hmijail Comme je l'ai expliqué, j'utilise cette méthode lorsque je veux construire un projet unique sans gâcher toute mon installation. Cela fonctionne très bien et je peux facilement le supprimer après.
Thomas Baruchel

1
Le simple fait de changer votre PATH serait plus rapide, plus propre et permettrait de synchroniser vos outils liés à gcc les uns avec les autres.
hmijail pleure les démissionnaires

0

J'ai utilisé uniquement les lignes ci-dessous et cela a fonctionné. Je voulais juste compiler VirtualBoxet en VMWare WorkStationutilisant kernel 4.8.10le Ubuntu 14.04. Au départ, la plupart des choses ne fonctionnaient pas, par exemple les graphiques et la mise en réseau. J'ai eu la chance d'avoir VMWare workstationdemandé gcc 6.2.0. Je n'ai pas pu démarrer ma Genymotion Android emulatorscar virtualbox était en panne. Publiera les résultats plus tard si nécessaire.

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.