Atualizar GCC no Ubuntu 16

Meu notebook Ubuntu 16, atualmente, roda a versão 5.5 do GCC:

gcc --version
gcc (Ubuntu 5.5.0-12ubuntu1~16.04) 5.5.0 20171010
Copyright (C) 2015 Free Software Foundation, Inc.

De acordo com o site oficial do GCC, the GNU Compiler Collection, as versões mais novas (e com as útlimas features do compilador) são a 9.2 e a 8.3. Infelizmente essas versões mais novas não estão disponíveis nos repositórios oficiais do Ubuntu, mas podem ser adicionadas através de repositórios específicos. Para atualizar as versões do GCC em seu Ubuntu, siga as instruções a seguir.

Em primeiro lugar, adicione o Ubuntu Toolchain PPA em sua lista de repositórios, para que as Toolchains atuais de C/C++ (e outras) fiquem disponíveis, e atualize o sistema:

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update

Instale alguns pré-requisitos (provavelmente já instalados se você está precisando atualizar o GCC):

sudo apt-get install build-essential manpages-dev software-properties-common

Instale agora as versões da GCC/C++ que desejar:

sudo apt-get install gcc g++ gcc-5 g++-5 gcc-6 g++-6 gcc-7 g++-7 gcc-8 g++-8 gcc-9 g++-9

Note que mesmo após a instalação de versões mais novas, a versão padrão continua sendo a 5.5:

gcc --version
gcc (Ubuntu 5.5.0-12ubuntu1~16.04) 5.5.0 20171010

Só que agora as outras versões também estão disponíveis no sistema. Verifique isso com:

gcc-9 --version
gcc-9 (Ubuntu 9.2.1-17ubuntu1~16.04) 9.2.1 20191102

gcc-8 --version
gcc-8 (Ubuntu 8.3.0-16ubuntu3~16.04) 8.3.0

gcc-7 --version
gcc-7 (Ubuntu 7.4.0-1ubuntu1~16.04~ppa1) 7.4.0

gcc-6 --version
gcc-6 (Ubuntu 6.5.0-2ubuntu1~16.04) 6.5.0 20181026

gcc-5 --version
gcc-5 (Ubuntu 5.5.0-12ubuntu1~16.04) 5.5.0 20171010

O segredo aqui é o seguinte: o comando gcc é apenas um link simbólico para algum executável específico, no meu caso o gcc-5:

ls -lh /usr/bin/gcc
lrwxrwxrwx 1 root root 5 Fev 11  2016 /usr/bin/gcc -> gcc-5

Você precisa então atualizar o link simbólico para a versão desejada, mas NÃO É RECOMENDÁVEL fazer isso manualmente, através da edição direta do link. Isso porque além do GCC temos que atualizar os “compiladores relacionados” de cada versão. Além disso temos que configurar uma prioridade entre as diferentes versões do GCC. Isso é feito com os comandos abaixo.

Atualizar as alternativas para o GCC-9, com prioridade 90:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 \
     --slave /usr/bin/g++        g++        /usr/bin/g++-9 \
     --slave /usr/bin/gcc-ar     gcc-ar     /usr/bin/gcc-ar-9 \
     --slave /usr/bin/gcc-nm     gcc-nm     /usr/bin/gcc-nm-9 \
     --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-9

Atualizar as alternativas para o GCC-8, com prioridade 80:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 80 \
     --slave /usr/bin/g++        g++        /usr/bin/g++-8 \
     --slave /usr/bin/gcc-ar     gcc-ar     /usr/bin/gcc-ar-8 \
     --slave /usr/bin/gcc-nm     gcc-nm     /usr/bin/gcc-nm-8 \
     --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-8

Atualizar as alternativas para o GCC-7, com prioridade 70:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70 \
     --slave /usr/bin/g++        g++        /usr/bin/g++-7 \
     --slave /usr/bin/gcc-ar     gcc-ar     /usr/bin/gcc-ar-7 \
     --slave /usr/bin/gcc-nm     gcc-nm     /usr/bin/gcc-nm-7 \
     --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-7

Atualizar as alternativas para o GCC-6, com prioridade 60:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 60 \
     --slave /usr/bin/g++        g++        /usr/bin/g++-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

Atualizar as alternativas para o GCC-5, com prioridade 50:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 50 \
     --slave /usr/bin/g++        g++        /usr/bin/g++-5 \
     --slave /usr/bin/gcc-ar     gcc-ar     /usr/bin/gcc-ar-5 \
     --slave /usr/bin/gcc-nm     gcc-nm     /usr/bin/gcc-nm-5 \
     --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-5

Ao executar os comandos acima você informou ao sistema qual GCC utilizar e, principalmente, determinou uma prioridade de uso. A alternativa com a maior prioridade é considerada como a padrão. Verifique isso:

gcc --version
gcc (Ubuntu 9.2.1-17ubuntu1~16.04) 9.2.1 20191102

Agora o GCC-9 é o compilador C padrão de seu sistema! Posteriormente, se quiser alterar as prioridades, execute:

sudo update-alternatives --config gcc
There are 5 choices for the alternative gcc (providing /usr/bin/gcc).
 Selection    Path            Priority   Status
----------------------------------------------------------
 0            /usr/bin/gcc-9   90        auto mode
 1            /usr/bin/gcc-5   50        manual mode
 2            /usr/bin/gcc-6   60        manual mode
 3            /usr/bin/gcc-7   70        manual mode
 4            /usr/bin/gcc-8   80        manual mode
 5            /usr/bin/gcc-9   90        manual mode 
 Press  to keep the current choice[*], or type selection number:

Note que o sistema já selecionou o GCC-9 como o padrão (pois tinha a maior prioridade), mas você pode digitar um dos números da coluns “Selection” e trocar a versão do GCC padrão de seu sistema!

Vamos testar se o novo compilador está funcionando como deveria com um “Olá, mundo!”. Crie o arquivo teste.c com o seguinte conteúdo:

#include <stdio.h>

int main(void)
{
    printf("Olá, mundo!\n");
    return 0;
}

Agora compile este código com:

gcc -o teste teste.c

Hora da verdade: execute o programa gerado!

./teste 
Olá, mundo!

Pronto, o novo compilador (GCC-9) está funcionando corretamente em um Ubuntu 16!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *