Diferença entre CC, gcc e g++?

Qual é a diferença entre os 3 Compiladores CC, gcc, g++ ao compilar Código C E C++ em termos de montagem geração de código, bibliotecas disponíveis, recursos de linguagem, etc.?

Author: mrflash818, 2009-10-04

3 answers

A resposta a isto é específica da plataforma; o que acontece no Linux é diferente do que acontece no Solaris, por exemplo.

A parte fácil (porque não é específica da plataforma) é a separação de 'gcc' e ' g++':

  • o gcc é o compilador GNU C do GCC (GNU Compiler Collection).
  • g++ é o compilador C++ GNU do GCC.

A parte difícil, porque é específica da plataforma, é o Significado de " CC "(e "cc").

  • em Solaris, CC é normalmente o nome do compilador Sun c++.
  • em Solaris, cc é normalmente o nome do compilador Sun C.
  • no Linux, se existir, o CC é provavelmente um link para o g++.
  • no Linux, cc é um link para o gcc.

No entanto, mesmo em Solaris, pode ser que cc seja o antigo compilador C baseado em BSD de {[[0]}. Na prática, isso geralmente não é instalado e há apenas um stub que falha, causando caos naqueles que tentam compilar e instalar auto-configurar software.

Em HP-UX, o padrão ' cc ' ainda é um compilador K&R-somente C instalado para permitir relinking do kernel quando necessário, e inutilizável para o trabalho de software moderno, porque ele não suporta o padrão C. Você tem que usar nomes alternativos de compilador ('acc' IIRC). Da mesma forma, no AIX, o compilador system C passa por nomes como 'xlc' ou 'xlc32'.

Classicamente, o compilador de sistema por omissão chamava-se' cc ' e o software auto-configurável recai sobre esse nome quando não sabe o que mais usar.

POSIX tentou legislar o seu caminho em torno disto, exigindo que os programas c89 (originalmente) e C99 mais tarde existissem; estes são os compiladores compatíveis com as normas ISO/IEC 9899:1989 e 9899:1999 C. É duvidoso que POSIX tenha conseguido.


A pergunta faz sobre as diferenças em termos de recursos e bibliotecas. Como antes, a resposta é a plataforma específica em parte, e genérica em parte.

A grande divisão é entre os compiladores C e os compiladores C++. Os compiladores C++ irão aceitar programas C++ e não irão compilar programas C arbitrários. (Embora seja possível escrever C em um subconjunto que também é entendido por C++, muitos programas C não são programas C++ válidos). Da mesma forma, os compiladores C irão aceitar programas C e rejeitar a maioria dos programas C++ (porque a maioria dos programas C++ usam construções não disponíveis Em C).

O conjunto de bibliotecas disponíveis para uso depende do idioma. Programas C++ podem usar bibliotecas C em uma dada plataforma; os programas C não podem usar bibliotecas C++. Então, C++ tem um conjunto maior de bibliotecas disponíveis.

Note que se estiver no Solaris, o código do objecto produzido pelo CC não é compatível com o código do objecto produzido pelo g++ -- são dois Compiladores separados com convenções separadas para coisas como o tratamento de excepções e o tratamento de nomes (e o tratamento de nomes é deliberadamente diferente para garantir que Ficheiros de objectos incompatíveis não estão ligados entre si!). Isto significa que se você quiser usar uma biblioteca compilada com CC, você deve compilar todo o seu programa com CC. Isso também significa que se você quiser usar uma biblioteca compilada com CC e outra compilada com g++, Você está sem sorte. Você tem que recompilar pelo menos uma das bibliotecas.

Em termos de qualidade da montagem gerada, o GCC (GNU Compiler Collection) faz um trabalho muito bom. Mas às vezes os compiladores nativos trabalham um pouco melhor. Os compiladores da Intel têm optimizações mais extensas que têm ainda não foi replicado no CCG, creio. Mas tais Pontifícios são perigosos, enquanto não sabemos com que plataforma você está preocupado.

Em termos de características da linguagem, os compiladores são geralmente bastante próximos dos padrões atuais (C++98, C++2003, C99), mas existem geralmente pequenas diferenças entre a linguagem padrão e a linguagem suportada pelo compilador. O suporte padrão C89 mais antigo é essencialmente o mesmo (e completo) para todos os compiladores C. Há diferenças nos cantos mais escuros da língua. Precisa de compreender o "comportamento indefinido", o "comportamento definido pelo sistema" e o "comportamento não especificado"; se invocar um comportamento indefinido, obterá resultados diferentes em momentos diferentes. Há também muitas opções (especialmente com o GCC) para ajustar o comportamento do compilador. O GCC tem uma variedade de extensões que tornam a vida mais simples se você sabe que você está apenas targetting que a família do compilador.

 92
Author: Jonathan Leffler, 2009-10-04 15:49:07

CC é uma variável de ambiente referente ao compilador C do sistema. O que ele aponta para (bibliotecas acessíveis, etc) depende da plataforma. Muitas vezes ele apontará para /usr/bin/cc, o complier c real (driver). Nas plataformas linux, {[[0]} quase sempre aponta para /usr/bin/gcc.

gcc é o executor binário para a coleção GNU de compiladores. Ele pode compilar C, C++ e possivelmente outras linguagens; ele determina a linguagem pela extensão de arquivo.

g++ é um executor binário como gcc, mas com algumas opções especiais definidas para compilar C++. Notavelmente (na minha experiência), g++ irá ligar a libstdc++ por omissão, enquanto gcc não irá.

 20
Author: Managu, 2009-10-04 15:04:12

Eu quero adicionar apenas uma informação que cc em Linux. Está ligado ao gcc. Para verificar. enter image description here

Da mesma forma, a mesma coisa com C++.

uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ whereis c++
c++: /usr/bin/c++ /usr/include/c++ /usr/share/man/man1/c++.1.gz  
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /usr/bin/c++
lrwxrwxrwx 1 root root 21 Jul 31 14:00 /usr/bin/c++ -> /etc/alternatives/c++
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /etc/alternatives/c++
lrwxrwxrwx 1 root root 12 Jul 31 14:00 /etc/alternatives/c++ -> /usr/bin/g++
 0
Author: Uddhav Gautam, 2018-08-13 15:37:04