Introdução: O drama dos dois nomes
\n\nSe você já tentou compilar um programa em C++ no Linux ou macOS, certamente já se deparou com dois comandos semelhantes: gcc e g++. À primeira vista, a diferença entre eles é mínima — ambos executam o compilador, ambos sabem trabalhar com C e C++. Mas basta errar na escolha, e você recebe uma montanha de erros de linkagem que podem estragar a noite até mesmo de um desenvolvedor experiente.
Esta questão é uma das mais populares no Stack Overflow (mais de 200.000 visualizações!). Iniciantes costumam pensar: "Já que o gcc consegue compilar C++, para que serve o g++?" E é um erro. Hoje vamos entender de uma vez por todas qual é o truque, com exemplos reais de código. Você aprenderá quando usar gcc, quando usar g++ e como não cair na armadilha das dependências implícitas.
Breve histórico: o que é GCC?
\n\nGCC (GNU Compiler Collection) não é um único compilador, mas sim um conjunto completo de ferramentas. Ele inclui compiladores para C, C++, Fortran, Ada e outras linguagens. Historicamente, a sigla significava "GNU C Compiler", mas com o passar dos anos o projeto cresceu.
\n\nO comando gcc é um driver que, por padrão, executa o compilador para a linguagem C. O comando g++ é o mesmo driver, mas com flags que ativam o suporte a C++. Parece um detalhe. Mas é justamente esse "detalhe" que decide se seu código funcionará ou não.
Principal diferença: linkagem das bibliotecas padrão
\n\nImagine que você está escrevendo um programa simples em C++:
\n\n#include <iostream>\nint main() {\n std::cout << "Olá, mundo!" << std::endl;\n return 0;\n}\n\n\nVamos tentar compilá-lo de duas maneiras:
\n\ngcc main.cpp -o program_gcc\ng++ main.cpp -o program_gpp\n\n\nResultado:
\n- \n
g++— a compilação será bem-sucedida. \n gcc— você receberá um erro de linkagemundefined reference to `std::cout'. \n
Por quê? Porque o gcc não vincula automaticamente a biblioteca libstdc++ (a biblioteca padrão do C++). Ele pensa que você está compilando C puro, e em C não existem iostream, std::string e outras vantagens do C++. O g++ faz isso automaticamente.
Claro, você pode forçar o gcc a trabalhar com C++ manualmente, adicionando a flag -lstdc++:
gcc main.cpp -lstdc++ -o program_gcc_fixed\n\n\nMas para que reinventar a roda? O g++ faz isso "de fábrica".
E quanto à compilação de C puro?
\n\nAqui tudo é simétrico. Se você escrever um programa em C e tentar compilá-lo com g++, provavelmente funcionará. Mas o g++ interpretará o código como C++, o que significa:
- \n
- Verificações de tipo mais rigorosas. \n
- Regras diferentes para conversão implícita de tipos. \n
- Possíveis avisos (warnings) falsos. \n
Exemplo. Código em C:
\n\n#include <stdio.h>\nint main() {\n char *s = malloc(100);\n printf("Hello\\n");\n free(s);\n return 0;\n}\n\n\nEm C, isso é normal. Em C++, é necessária uma conversão explícita (char*)malloc(100). O g++ emitirá um erro, enquanto o gcc não. Conclusão: para projetos em C, use gcc; para C++, use g++.
Extensões de arquivo: como o compilador identifica a linguagem?
\n\nOutro detalhe importante: gcc e g++ observam a extensão do arquivo.
- \n
.c— compilado como C. \n .cpp,.cc,.cxx— compilado como C++. \n
Se você der ao gcc um arquivo com extensão .cpp, ele entenderá que é C++ e usará o frontend correto (compilador da linguagem). Mas a linkagem ainda será feita sem a