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!