Vous avez téléchargé g ++ 4.8 depuis le PPA mais vous ne pouvez pas le définir par défaut?

15

J'ai téléchargé g ++ 4.8 sur Ubuntu 12.10 en faisant:

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install g++-4.8

mais quand je fais:

sudo update-alternatives --config g++

pour changer de version g ++, il dit:

update-alternatives: error: no alternatives for g++.

Cependant, si je le fais:

g++ --version

ça dit:

g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Comment définir mon installation g ++ 4.8 comme g ++ par défaut?

user997112
la source

Réponses:

11

Tout d'abord, vous devez découvrir où sont vos 4.8 binaires de tous les outils:

$ which gcc-4.8
/usr/bin/gcc-4.8
$ which g++-4.8
/usr/bin/g++-4.8
$ ls /usr/bin/*-4.8
/usr/bin/cpp-4.8         /usr/bin/x86_64-linux-gnu-cpp-4.8
/usr/bin/g++-4.8         /usr/bin/x86_64-linux-gnu-g++-4.8
/usr/bin/gcc-4.8         /usr/bin/x86_64-linux-gnu-gcc-4.8
/usr/bin/gcc-ar-4.8      /usr/bin/x86_64-linux-gnu-gcc-ar-4.8
/usr/bin/gcc-nm-4.8      /usr/bin/x86_64-linux-gnu-gcc-nm-4.8
/usr/bin/gcc-ranlib-4.8  /usr/bin/x86_64-linux-gnu-gcc-ranlib-4.8
/usr/bin/gcov-4.8

Donc, nous avons tous nos binaires, voyons maintenant si certains liens symboliques sont disponibles pour de tels binaires:

$ cd /usr/bin
$ ls -l gcc* cpp g++
lrwxrwxrwx 1 root root      7 sep 18 14:02 cpp -> cpp-4.7
lrwxrwxrwx 1 root root      7 abr 22  2013 g++ -> g++-4.7
lrwxrwxrwx 1 root root      7 sep 18 14:02 gcc -> gcc-4.7

Comme nous pouvons le voir, seulement cpp, g++et gcca des liens symboliques. Nous avons deux options ici.

Symlinking

Nous remplaçons les liens symboliques par les nôtres, en supprimant d'abord les chiffres réels:

sudo rm /usr/bin/cpp /usr/bin/gcc /usr/bin/g++

Puis en créant le nôtre

sudo ln -s /usr/bin/cpp-4.8 /usr/bin/cpp
sudo ln -s /usr/bin/gcc-4.8 /usr/bin/gcc
sudo ln -s /usr/bin/g++-4.8 /usr/bin/g++

Pour revenir en arrière, utilisez les mêmes commandes mais avec 4.7 ou 4.6 à la place

sudo rm /usr/bin/cpp /usr/bin/gcc /usr/bin/g++
sudo ln -s /usr/bin/cpp-4.7 /usr/bin/cpp
sudo ln -s /usr/bin/gcc-4.7 /usr/bin/gcc
sudo ln -s /usr/bin/g++-4.7 /usr/bin/g++
Braiam
la source
Quand j'ai fait: ls -l gcc * cpp g ++, il a renvoyé: ls: ne peut pas accéder à gcc *: aucun fichier ou répertoire de ce type ls: ne peut pas accéder à cpp: aucun fichier ou répertoire de ce type ls: ne peut pas accéder à g ++: aucun fichier ou répertoire de ce type
user997112
Aucune excuse requise :) Une fois que j'appelle la fonction de suppression, cela fonctionne, mais quand je vais créer "nos" liens symboliques, il dit: sudo ln -s -T / usr / bin / cpp /usr/bin/cpp-4.8 ln: a échoué créer un lien symbolique `/usr/bin/cpp-4.8 ': le fichier existe
user997112
(J'ai appelé la commande rm deux fois juste pour la deuxième fois, il a confirmé / s'est plaint que les liens existants ont été supprimés)
user997112
3
C'est une terrible idée . Il existe de nombreux programmes qui utilisent gccpour compiler les modules du noyau et certains d'entre eux (par exemple Nvidia) plantent silencieusement quand gccils appellent ne sera pas celui avec lequel le noyau a été compilé.
nbubis
1
@nbubis bien, la question est "Comment puis-je définir mon installation g ++ 4.8 comme g ++ par défaut?", donc, on devrait présumer que quiconque fait cela, ils savent ce qu'ils font, non? D'un autre côté, quelle alternative pouvez-vous proposer?
Braiam
16

Vous devez update-alternativesindiquer que vous disposez de 2 compilateurs C ++, créer un enregistrement pour chacun, puis configurer celui que vous souhaitez utiliser. Cela se fait avec les éléments suivants:

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6.3 60
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 40
sudo update-alternatives --config g++ 

À partir de ce moment, la seule chose requise lors du changement de compilateur est cette commande:

sudo update-alternatives --config g++

Voir man update-alternativespour plus d'informations.

Source: Comment utiliser plusieurs instances de gcc?

Radu Rădeanu
la source
@Braiam Cela peut être fait de la même manière avec n'importe quel package.
Radu Rădeanu
3
Quelqu'un peut-il élaborer sur les 60 et 40? J'ai vu cela dans beaucoup d'endroits
user997112
@ user997112 Je vous suggère de lire l'homme, mais si vous aimez plus 70 et 30, alors utilisez 70 et 30 ...
Radu Rădeanu
1
@ user997112 ce sont des numéros prioritaires et ne sont pertinents que lorsque vous utilisez --auto. vous pouvez voir quelques exemples en utilisantupdate-alternatives --display editor
Braiam
2
Le 12.04, j'obtiens: update-alternatives: erreur: l'alternative g ++ ne peut pas être maître: c'est un esclave de gcc
rickfoosusa
9

Il s'agit de la grande description et des instructions étape par étape pour créer et gérer des alternatives maître et esclave (gcc et g ++).

Bref, c'est

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7 
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.8 
sudo update-alternatives --config gcc
Anton K
la source
Bienvenue sur Ask Ubuntu! Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure ici les parties essentielles de la réponse et de fournir le lien de référence.
Stormvirux
Tu as raison. J'ai ajouté la partie essentielle
Anton K
1
J'ai sauvé ma journée avec ces trucs d'esclaves. tx
Lennart Rolland