Como alterar o compilador GCC padrão no Ubuntu?

95

Eu instalei o gcc-3.3 / g ++ - 3.3 no ubuntu 11.04, que já tem o gcc / g ++ - 4.4. Portanto, em meu sistema tanto o gcc-3.3 quanto o 4.4 estão disponíveis. Consigo chamar os dois compiladores conforme desejo. Se eu apenas chamar o comando gcc, gcc-4.4 será chamado. Para chamar gcc-3.3, preciso usar o comando gcc-3.3.

Como posso alterar o compilador padrão como gcc-3.3? Quando eu executar o comando gccele deve chamar o gcc-3.3 e não o gcc-4.4.

Além disso, como posso alterar a variável CXX em um arquivo make para gcc-3.3? Desejo alterar um local global comum no sistema em vez de alterar todos os arquivos make.

RoboAlex
fonte
2
Para o sinalizador CXX, você pode invocar CXX=gcc-3.3ou export CXX=gcc-3.3e, makeentretanto, quando você o alterou globalmente, update-alternativesele já usará o gcc-3.3 e isso não é necessário.
DipSwitch de
1
@RoboAlex: atualizei minha resposta novamente para levar em consideração sua solicitação de variável de ambiente CXX. No entanto, observe que isso só servirá no caso de você modificar as alternativas de atualização posteriormente.
jopasserat
Você só precisa alterar seu PATH. A maioria das respostas menciona o sistema de alternativas, mas ambos os mantenedores do Debian e do LLVM concordam que o sistema de alternativas deve ser usado para alternativas , NÃO para versionamento . Mais explicado na minha resposta.
hmijail lamenta renúncias

Respostas:

112

Como @Tommy sugeriu, você deve usar update-alternatives.
Atribui valores a cada software de uma família, de forma que define a ordem em que os aplicativos serão chamados.

É usado para manter diferentes versões do mesmo software em um sistema. No seu caso, você poderá usar várias declinações de gcc, e uma será favorecida.

Para descobrir as prioridades atuais do gcc, digite o comando apontado pelo comentário de @tripleee:

update-alternatives --query gcc

Agora, observe a prioridade atribuída a gcc-4.4porque você precisará dar uma prioridade mais alta a gcc-3.3.
Para definir suas alternativas, você deve ter algo assim (assumindo que sua gccinstalação está localizada em /usr/bin/gcc-3.3e gcc-4.4a prioridade de é inferior a 50) :

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

--editar--

Por fim, você também pode usar a interface interativa do update-alternativespara alternar facilmente entre as versões. Digite update-alternatives --config gccpara ser solicitado a escolher a versão do gcc que deseja usar entre as instaladas.

--editar 2 -

Agora, para corrigir a variável de ambiente CXX em todo o sistema, você precisa colocar a linha indicada por @ DipSwitch's em seu .bashrcarquivo (isso aplicará a alteração apenas para seu usuário, que é mais seguro em minha opinião):

echo 'export CXX=/usr/bin/gcc-3.3' >> ~/.bashrc
Jopasserat
fonte
1
@thang também chamado de cc:root@host:/root# update-alternatives --get-selections | grep '/usr/bin/gcc' cc auto /usr/bin/gcc
jopasserat
Quando executo o 'update-alternative --config gcc', nada acontece, embora eu tenha o gcc e o anaconda do sistema
Kelthar,
como você poderia fazer isso automaticamente? isso requer uma etapa manual para verificar a saída update-alternatives --query gcc, o que pode não funcionar, por exemplo, em um script de provisionamento automatizado. Além disso, como isso pode ser tornado agnóstico em relação à plataforma?
ely
68

Aqui está um exemplo completo da resposta de jHackTheRipper para a multidão de TL; DR. :-) Neste caso, eu queria executar o g ++ - 4.5 em um sistema Ubuntu cujo padrão é 4.6. Como 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

Aqui, 4.6 ainda é o padrão (também conhecido como "modo automático"), mas eu alterno explicitamente para 4.5 temporariamente (modo manual). Para voltar a 4.6:

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

(Observe o uso de em cpp-binvez de apenas cpp. O Ubuntu já tem uma cppalternativa com um link mestre de /lib/cpp. Renomear esse link removeria o /lib/cpplink, o que poderia quebrar os scripts.)

Trevor Robinson
fonte
8
Para a pessoa preguiçosa do futuro que tenta definir o compilador g ++ - 5 instalado como padrão:sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100
imallett
Resta apenas uma pergunta: por que o APT não faz isso ao instalar o g++-6pacote?
rustyx
Troquei o compilador padrão para g ++ - 5 desta forma, mas ele ainda usa as bibliotecas padrão do g ++ - 7 e agora estou recebendo erros com __builtincoisas indefinidas .
Youda008
22

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

Em breve é:

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
Anton K
fonte
o que há com o 40 e 60. Estou tentando usar o gcc-6.
Nyxee
@nyxee 40 e 60 denotam a prioridade atribuída a cada entrada, verifique as outras respostas para obter mais detalhes sobre o tópico
jopasserat
10

Entre 4,8 e 6 com todos --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

e

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

Alterne entre eles com update-alternatives --config gcc.

szotsaki'gofundme-DefendFromSO
fonte
2
funciona bem após a remoção das linhas cce c++, o que causa erro: o cc alternativo não pode ser escravo do gcc: é uma alternativa mestre
palik
7

Agora, há gcc-4.9 disponível para Ubuntu / precise.

Crie um grupo de alternativas de compilador em que o compilador da distro tenha uma prioridade mais alta:

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

NOTA: a versão g ++ é alterada automaticamente com uma troca de versão gcc. O cpp-bin deve ser feito separadamente, pois existe uma alternativa mestre "cpp".

Liste as alternativas de compilador disponíveis:

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

Para selecionar manualmente a versão 4.9 do gcc, g ++ e cpp, faça:

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

Verifique as versões do compilador:

root$ for i in gcc g++ cpp ; do $i --version ; done

Restaure as configurações do compilador da distro (aqui: de volta à v4.6):

root$ update-alternatives --auto gcc
root$ update-alternatives --auto cpp-bin
dileks
fonte
2

Eu encontrei esse problema ao tentar instalar um novo compilador Clang. Acontece que os mantenedores do Debian e do LLVM concordam que o sistema de alternativas deve ser usado para alternativas, NÃO para controle de versão .

A solução que eles propõem é mais ou menos assim:
PATH=/usr/lib/llvm-3.7/bin:$PATH
onde /usr/lib/llvm-3.7/bin é um diretório que foi criado pelo pacote llvm-3.7 e que contém todas as ferramentas com seus nomes não sufixados. Com isso, llvm-config (versão 3.7) aparece com seu nome simples em seu PATH. Não há necessidade de mexer com links simbólicos, nem chamar o llvm-config-3.7 que foi instalado em / usr / bin.

Além disso, verifique se há um pacote chamado llvm-defaults (ou gcc-defaults), que pode oferecer outra maneira de fazer isso (eu não usei).

hmijail lamenta demitidos
fonte
Excelente solução! Eu uso para selecionar entre as suítes "gcc" personalizadas
Mad Calm
1

Caso você queira uma maneira mais rápida (mas ainda muito limpa) de alcançá-lo para um propósito pessoal (por exemplo, se você deseja construir um projeto específico com alguns requisitos fortes relativos à versão do compilador), basta seguir os seguintes passos:

  • digite echo $PATHe procure um diretório pessoal de alta prioridade (no meu caso, eu tenho ~/.local/bin);
  • adicione os links simbólicos neste diretório:

Por exemplo:

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

Claro, isso funcionará para um único usuário (não é uma solução para todo o sistema), mas por outro lado, não gosto de alterar muitas coisas na minha instalação.

Thomas Baruchel
fonte
Então você está criando seu próprio sistema de alternativas ad-hoc, paralelo ao sistema. Por que não usar a coisa real?
hmijail lamenta renúncias de
@hmijail Como expliquei, eu uso essa forma quando quero construir um único projeto sem bagunçar toda a minha instalação. Funciona muito bem e posso removê-lo facilmente depois.
Thomas Baruchel de
1
Apenas mudar seu PATH seria mais rápido, mais limpo e manteria suas ferramentas relacionadas ao gcc sincronizadas umas com as outras.
hmijail lamenta renúncias de
0

Usei apenas as linhas abaixo e funcionou. Eu só queria compilar VirtualBoxe VMWare WorkStationusando kernel 4.8.10on Ubuntu 14.04. Inicialmente, a maioria das coisas não estava funcionando, por exemplo, gráficos e rede. Tive a sorte de ter VMWare workstationsolicitado gcc 6.2.0. Não consegui iniciar meu Genymotion Android emulatorsporque o virtualbox estava inativo. Postará os resultados mais tarde, se necessário.

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
Nyxee
fonte