Baixou g ++ 4.8 do PPA, mas não pode defini-lo como padrão?

15

Eu baixei o g ++ 4.8 no Ubuntu 12.10 fazendo o seguinte:

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

mas quando eu faço:

sudo update-alternatives --config g++

para mudar as versões do g ++, ele diz:

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

No entanto, se eu fizer:

g++ --version

diz:

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.

Como faço para definir minha instalação do g ++ 4.8 como o g ++ padrão?

user997112
fonte

Respostas:

11

Primeiro de tudo, você deve descobrir onde estão os binários 4.8 de todas as ferramentas:

$ 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

Portanto, temos todos os nossos binários, agora vamos ver se alguns links simbólicos estão disponíveis para esses binários:

$ 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

Como podemos ver, única cpp, g++egcc possui links simbólicos. Temos duas opções aqui.

Ligação simbólica

Substituímos os links simbólicos pelos nossos, removendo os números reais primeiro:

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

Então criando o nosso

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++

Para revertê-lo, use os mesmos comandos, mas com 4.7 ou 4.6

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
fonte
Quando fiz: ls -l gcc * cpp g ++, ele retornou: ls: não pode acessar o gcc *: não existe esse arquivo ou diretório ls: não pode acessar o cpp: não existe esse arquivo ou diretório ls: não pode acessar o g ++: não
existe
Não é necessário desculpas :) Depois que eu chamo a função remove, ela funciona, mas quando vou criar os links simbólicos "our", ele diz: sudo ln -s -T / usr / bin / cpp /usr/bin/cpp-4.8 ln: falha criar link simbólico `/usr/bin/cpp-4.8 ': O arquivo existe
user997112
(Eu chamei o comando rm duas vezes apenas para que no segundo tempo que confirmou / queixou-se que as ligações existentes foram, de facto excluído)
user997112
3
Esta é uma péssima ideia . Existem muitos programas que usam gccpara compilar módulos do kernel e alguns deles (por exemplo, Nvidia) travam silenciosamente quando gcceles chamam de não ser o que o kernel foi compilado.
Nbubis 27/08/2015
1
@ nbubis bem, a pergunta é "Como faço para definir minha instalação do g ++ 4.8 como o g ++ padrão?", portanto, deve-se presumir quem faz isso, eles sabem o que estão fazendo, não? Por outro lado, que alternativa você pode propor?
Braiam
16

Você precisa informar update-alternativesque possui 2 compiladores C ++, criar um registro para cada um e, em seguida, configurar qual deles deseja usar. Isso é feito com o seguinte:

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++ 

A partir deste momento, a única coisa necessária ao alternar compiladores é este comando:

sudo update-alternatives --config g++

Veja man update-alternativespara mais informações.

Fonte: Como usar várias instâncias do gcc?

Radu Rădeanu
fonte
@Braiam Isso pode ser feito da mesma maneira com qualquer pacote.
Radu Rădeanu
3
Alguém pode elaborar sobre os 60 e 40? Eu já vi isso em muitos lugares #
user997112 07/07/13
@ user997112 eu sugiro que você leia o homem, mas, se você gosta de mais de 70 e 30, então use 70 e 30 ...
Radu Rădeanu
1
@ user997112 estes são números de prioridade e são relevantes apenas ao usar --auto. você pode ver alguns exemplos usandoupdate-alternatives --display editor
Braiam
2
Em 12,04 eu recebo: update-alternatives: error: g alternativa ++ não pode ser mestre: é um escravo do gcc
rickfoosusa
9

Esta é a ótima descrição e instruções passo a passo de como criar e gerenciar alternativas de mestre e escravo (gcc e g ++).

Em breve, é

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
fonte
Bem-vindo ao Ask Ubuntu! Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
Stormvirux
Você está certo. Eu adicionei a parte essencial
Anton K
1
Salvou meu dia com essas coisas de escravos. tx
Lennart Rolland