266 votes

Comment choisir la version par défaut de gcc et g++?

Donc j'ai installé gcc-4.4 et gcc-4.3 (pareil pour g++). Maintenant, autant que je me souvienne, il y a un outil dans Ubuntu qui définit les liens symboliques pour vous si vous lui dites simplement quelle version vous voulez. Cependant, cela ne semble pas fonctionner dans la dernière version, ce que je trouve décevant.

root@nexus:~# update-alternatives --config gcc
update-alternatives: erreur: aucune alternative pour gcc.
root@nexus:~# update-alternatives --config cc
Il n'y a qu'une seule alternative dans le groupe de liens cc : /usr/bin/gcc
Rien à configurer.

root@nexus:~# dpkg -l | grep gcc | awk '{print $2}'
gcc
gcc-4.3
gcc-4.3-base
gcc-4.3-multilib
gcc-4.4
gcc-4.4-base
gcc-4.4-multilib
gcc-4.5-base
gcc-multilib
lib32gcc1
libgcc1

Des idées?

353voto

NotMe Points 3732

Tout d'abord, effacez la configuration actuelle de update-alternatives pour gcc et g++:

sudo update-alternatives --remove-all gcc 
sudo update-alternatives --remove-all g++

Installer les Paquets

Il semble que à la fois gcc-4.3 et gcc-4.4 soient installés après l'installation de build-essential. Cependant, nous pouvons installer explicitement les paquets suivants:

sudo apt-get install gcc-4.3 gcc-4.4 g++-4.3 g++-4.4

Installer les Alternatives

Les liens symboliques cc et c++ sont installés par défaut. Nous allons installer des liens symboliques pour gcc et g++, puis lier cc et c++ respectivement à gcc et g++. (Notez que les options 10, 20 et 30 sont les priorités pour chaque alternative, où un plus grand nombre est une priorité plus élevée.)

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.3 10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 20

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.3 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 20

sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30
sudo update-alternatives --set cc /usr/bin/gcc

sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30
sudo update-alternatives --set c++ /usr/bin/g++

Configurer les Alternatives

La dernière étape consiste à configurer les commandes par défaut pour gcc, g++. Il est facile de basculer entre 4.3 et 4.4 de manière interactive:

sudo update-alternatives --config gcc
sudo update-alternatives --config g++

Ou basculer en utilisant un script:

#!/bin/sh

if [ -z "$1" ]; then
    echo "usage: $0 version" 1>&2
    exit 1
fi

if [ ! -f "/usr/bin/gcc-$1" ] || [ ! -f "/usr/bin/g++-$1" ]; then
    echo "pas de version gcc/g++ installée" 1>&2
    exit 1
fi

update-alternatives --set gcc "/usr/bin/gcc-$1"
update-alternatives --set g++ "/usr/bin/g++-$1"

52voto

NotMe Points 3732

Exécuter dans le terminal :

gcc -v
g++ -v

D'accord, cette partie est assez simple. La partie délicate est que lorsque vous émettez la commande GCC, il s'agit en fait d'un lien symbolique vers la version de GCC que vous utilisez. Cela signifie que nous pouvons créer un lien symbolique de GCC vers la version de GCC que nous souhaitons.

  • Vous pouvez voir le lien symbolique :
ls -la /usr/bin | grep gcc-4.4
ls -la /usr/bin | grep g++-4.4
  • Donc ce que nous devons faire est de supprimer le lien symbolique GCC et le lien symbolique G++ et ensuite les recréer en les liant à GCC 4.3 et G++ 4.3 :
rm /usr/bin/gcc
rm /usr/bin/g++

ln -s /usr/bin/gcc-4.3 /usr/bin/gcc
ln -s /usr/bin/g++-4.3 /usr/bin/g++
  • Maintenant, si nous vérifions à nouveau les liens symboliques, nous verrons que GCC et G++ sont désormais liés à GCC 4.3 et G++ 4.3 :
ls -la /usr/bin/ | grep gcc
ls -la /usr/bin/ | grep g++
  • Enfin, nous pouvons à nouveau vérifier notre version GCC -v et nous assurer que nous utilisons la bonne version :
gcc -v
g++ -v

25voto

Mufaka Points 54

Est-ce vraiment souhaitable? Il y a des changements ABI entre les versions de gcc. Compiler quelque chose avec une version (par exemple tout le système d'exploitation) et puis compiler quelque chose d'autre avec une autre version peut causer des conflits.

Par exemple, les modules du noyau doivent toujours être compilés avec la même version de gcc utilisée pour compiler le noyau. Avec cela à l'esprit, si vous avez modifié manuellement le lien symbolique entre /usr/bin/gcc et la version utilisée dans votre version d'Ubuntu, les modules construits avec DKMS dans le futur pourraient utiliser la mauvaise version de gcc.

Si vous voulez simplement construire des choses avec une version différente de gcc, c'est assez simple, même avec des scripts de compilation. Par exemple, vous pouvez passer la version de gcc dans la variable d'environnement CC:

CC="gcc-4.5" ./configure
CC="gcc-4.5" make

Vous pourriez ne pas en avoir besoin sur la commande make (les scripts de configuration l'incluent généralement) mais ce n'est pas gênant.

18voto

Ale Points 281

Modifier:

Cela suppose que vous avez installé la version en premier, par exemple :

sudo apt install gcc-4.9 g++-4.9

Original :

Et voici une ligne de commande pour ceux qui sont paresseux, il suffit de changer le nombre à la fin par la version que vous voulez. Cela fera le changement pour gcc et/ou g++

ls -la /usr/bin/ | grep -oP "[\S]*(gcc|g\+\+)(-[a-z]+)*[\s]" | xargs bash -c 'for link in ${@:1}; do sudo ln -s -f "/usr/bin/${link}-${0}" "/usr/bin/${link}"; done' 4.9

Dans cet exemple, j'ai changé pour la version 4.9

Il n'y a pas de vérifications d'erreurs dans cet exemple, donc vous devriez vérifier ce qui sera exécuté avant de le lancer. Ajoutez simplement echo avant sudo. Pour complétude, je fournis également la ligne de vérification :

ls -la /usr/bin/ | grep -oP "[\S]*(gcc|g\+\+)(-[a-z]+)*[\s]" | xargs bash -c 'for link in ${@:1}; do echo sudo ln -s -f "/usr/bin/${link}-${0}" "/usr/bin/${link}"; done' 4.9

La sortie de la vérification devrait ressembler à :

sudo ln -s -f /usr/bin/g++-4.9 /usr/bin/g++
sudo ln -s -f /usr/bin/gcc-4.9 /usr/bin/gcc
sudo ln -s -f /usr/bin/gcc-ar-4.9 /usr/bin/gcc-ar
sudo ln -s -f /usr/bin/gcc-nm-4.9 /usr/bin/gcc-nm
sudo ln -s -f /usr/bin/gcc-ranlib-4.9 /usr/bin/gcc-ranlib
sudo ln -s -f /usr/bin/x86_64-linux-gnu-g++-4.9 /usr/bin/x86_64-linux-gnu-g++
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-4.9 /usr/bin/x86_64-linux-gnu-gcc
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-ar-4.9 /usr/bin/x86_64-linux-gnu-gcc-ar
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-nm-4.9 /usr/bin/x86_64-linux-gnu-gcc-nm
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-ranlib-4.9 /usr/bin/x86_64-linux-gnu-gcc-ranlib

Vous pouvez vérifier la version après avec :

gcc --version

Explication semi-détaillée :

  • ls -la /usr/bin/ liste tous les fichiers dans /usr/bin
  • | pipe (envoyer) la sortie à la commande suivante
  • grep -oP correspond à l'expression regex de recherche par ligne. o affiche seulement le résultat et non toute la ligne correspondante. P indique à grep d'utiliser des regex perl. Je ne vais pas rentrer dans les détails de regex ici, renseignez-vous si vous voulez en savoir plus.
  • xargs simplement, il rassemble les résultats qui lui sont envoyés et les envoie tous à la fin, c'est-à-dire à la commande suivant xargs
  • bash eh bien, c'est bash. Le drapeau c lui indique d'utiliser la chaîne comme une commande. Dans cet exemple, il boucle sur les arguments envoyés par xargs en sautant le premier argument (0ème), dans ce cas la boucle saute 4.9. Le 0ème argument est utilisé dans la boucle pour changer le lien.
  • ln -s -f Le drapeau s crée un lien symbolique, f force le déliement avant si nécessaire.

5voto

m00sila Points 127

Je configure généralement aussi les outils gcc associés (gcc-ar, ...) en tant que slaves, donc vous pouvez tous les changer en une seule fois:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.3 10 \
    --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.3 \
    --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.3 \
    --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.3

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 20 \
    --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.4 \
    --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.4 \
    --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.4

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.3 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 20

Ensuite, pour sélectionner celui par défaut:

sudo update-alternatives --config gcc
sudo update-alternatives --config g++

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X