Como escolher a versão padrão gcc e g ++?

173

Então eu instalei o gcc-4.4 e o gcc-4.3 (o mesmo para g ++). Agora, tanto quanto me lembro, há uma ferramenta no Ubuntu que define os links simbólicos para você, se você acabou de dizer qual versão você quer. No entanto, não parece funcionar na versão mais recente, o que acho decepcionante.

root@nexus:~# update-alternatives --config gcc
update-alternatives: error: no alternatives for gcc.
root@nexus:~# update-alternatives --config cc
There is only one alternative in link group cc: /usr/bin/gcc
Nothing to configure.


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

Alguma idéia?

    
por Nils 15.02.2011 / 16:52

5 respostas

232

Primeiro, apagou a configuração atual de update-alternatives para gcc e g ++:

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

Instalar pacotes

Parece que tanto o gcc-4.3 quanto o gcc-4.4 estão instalados após a instalação. No entanto, podemos instalar explicitamente os seguintes pacotes:

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

Instalar alternativas

Links simbólicos cc e c ++ são instalados por padrão. Nós instalaremos os links de símbolos para gcc e g ++, em seguida, vincular cc e c ++ a gcc e g ++ respectivamente.

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

Configurar alternativas

O último passo é configurar os comandos padrão para o gcc, g ++. É fácil alternar entre 4.3 e 4.4 interativamente:

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

Ou alterne usando 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 "no such version gcc/g++ installed" 1>&2
    exit 1
fi

update-alternatives --set gcc "/usr/bin/gcc-$1"
update-alternatives --set g++ "/usr/bin/g++-$1"
    
por hhlp 15.02.2011 / 20:05
30

executar no terminal:

gcc -v
g++ -v

Ok, essa parte é bem simples. A parte complicada é que quando você emite o comando GCC, ele é na verdade um link simbólico para a versão do GCC que você está usando. O que isso significa é que podemos criar um link simbólico do GCC para qualquer versão do GCC que desejarmos.

  • Você pode ver o link simbólico:
% bl0ck_qu0te%
  • Então, o que precisamos fazer é remover o link simbólico do GCC e o link simbólico G ++ e, em seguida, recriá-los vinculados ao GCC 4.3 e ao G ++ 4.3:
% bl0ck_qu0te%
  • Agora, se verificarmos os links simbólicos novamente, veremos GCC & amp; O G + + agora está vinculado ao GCC 4.3 e ao G ++ 4.3:
% bl0ck_qu0te%
  • Finalmente, podemos verificar nosso GCC -v novamente e verificar se estamos usando a versão correta:
% bl0ck_qu0te%     
por hhlp 15.02.2011 / 17:49
20

Isso é realmente desejável? Há alterações de ABI entre gcc versions. Compilar algo com uma versão (por exemplo, o sistema operacional inteiro) e compilar outra coisa com outra versão, pode causar conflitos.

Por exemplo, os módulos do kernel devem sempre ser compilados com a mesma versão de gcc usada para compilar o kernel. Com isso em mente, se você alterou manualmente o link simbólico entre /usr/bin/gcc e a versão usada em sua versão do Ubuntu, futuros módulos criados pelo DKMS podem usar a versão gcc errada.

Se você quiser apenas criar coisas com uma versão diferente de gcc , isso é fácil, mesmo com os roteiros. Por exemplo, você pode passar a versão de gcc na variável de ambiente CC :

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

Você pode não precisar dele no comando make (os scripts de configuração geralmente o puxam), mas não faz mal.

    
por Oli 15.02.2011 / 17:22
10

Editar:

Isso pressupõe que você tenha instalado a versão primeiro, por exemplo:

sudo apt install gcc-4.9 g++-4.9

Original:

E aqui está um verso para aqueles que são preguiçosos, apenas mude o número no final para a versão que você quer. Ele fará a alteração para gcc e / 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

Neste exemplo, mudei para 4.9

Não há verificações de erro e o que não está neste exemplo, portanto, talvez você queira verificar o que será executado antes de executá-lo. Basta adicionar echo antes de sudo . Para completar, eu também forneço linhas de seleção:

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

A saída da verificação deve ser algo como:

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

Você pode verificar a versão depois com:

gcc --version

Explicação semi-detalhada:

  • ls -la / usr / bin / lista todos os arquivos em / usr / bin
  • | canaliza (envia) a saída para o próximo comando
  • grep -oP corresponde à regex de pesquisa por linha. o mostra apenas o resultado e não toda a linha correspondente. P diz ao grep para usar o perl-regex. Eu não vou entrar no regex aqui, leia-o se você quiser.
  • xargs simplismente, ele reúne os resultados que são enviados para ele e envia todos eles para o final. isto é, para o comando seguinte xargs
  • bash bem, é bash. O sinalizador c diz para usar a string como um comando. Neste exemplo, ele faz um loop sobre os argumentos enviados de xargs ignorando o primeiro (0th) argumento, nesse caso o loop ignora 4.9 . O 0º argumento é usado no loop para alterar o link.
  • ln -s -f O sinalizador s cria um link simbólico, f força a desvinculação primeiro, se necessário.
por Ale 15.10.2016 / 22:52
-1

Considere uma forma de atualizar:

  • sudo apt install gcc-7
  • sudo apt remove gcc-5
O

apt irá lidar com a equipe de links automaticamente nesse caso. A nova versão do C / C ++ é bastante compatível. Você dificilmente precisaria de um velho.

    
por Sergei 29.10.2017 / 21:02