Qual é a diferença entre g ++ e gcc?

875

Qual é a diferença entre g ++ e gcc? Qual deles deve ser usado para o desenvolvimento geral do c ++?

Brian R. Bondy
fonte
g ++ => compilador c ++ gcc => compilador c
Nagappa

Respostas:

727

gcce g++são drivers de compilador da GNU Compiler Collection (que era uma vez apenas o GNU C Compiler ).

Embora eles determinem automaticamente quais back-ends ( cc1 cc1plus...) chamar, dependendo do tipo de arquivo, a menos que sejam substituídos -x language, eles têm algumas diferenças.

A diferença provavelmente mais importante em seus padrões é em quais bibliotecas eles se vinculam automaticamente.

De acordo com as opções de link da documentação on-line do GCC e como o g ++ é chamado , g++é equivalente a gcc -xc++ -lstdc++ -shared-libgcc(a primeira é uma opção de compilador, a segunda é a opção de vinculador). Isso pode ser verificado executando ambos com a -vopção (ele exibe os comandos de cadeia de ferramentas de back-end em execução).

Kodiologist
fonte
13
A partir desta resposta, concluo que efetivamente o comando g ++ é apenas o gcc com um monte de sinalizadores. Por que então existem dois binários diferentes (aproximadamente do mesmo tamanho) para o gcc e o g ++ no linux? Não deveríamos ter apenas um binário e um link simbólico (ou algo nesse sentido)?
UchihaItachi
9
@Uchihaltachi esses arquivos são links físicos e, quando inicializados, verificam argv[0]qual invocação deve ser usada. Isso é bastante comum entre os principais utilitários UNIX.
Relish
438

GCC: Coleção GNU Compiler

  • Referenciadores para todos os diferentes idiomas suportados pelo compilador GNU.

gcc: Compilador
g++GNU C: Compilador GNU C ++

As principais diferenças:

  1. gccirá compilar: *.c\*.cppfiles como C e C ++, respectivamente.
  2. g++irá compilar: *.c\*.cppfiles, mas todos serão tratados como arquivos C ++.
  3. Além disso, se você usar g++para vincular os arquivos de objeto, ele vinculará automaticamente nas bibliotecas std C ++ ( gccnão faz isso).
  4. gcc compilar arquivos C possui menos macros predefinidas.
  5. gcccompilar *.cppe g++compilar *.c\*.cpparquivos possui algumas macros extras.

Macros extras ao compilar *.cpparquivos:

#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
Martin York
fonte
37
Você pode vincular a biblioteca std C ++ gccpassando o -lstdc++parâmetro
Denilson Sá Maia
16
Existem mais diferenças entre 'gcc' e 'g ++' do que apenas as bibliotecas padrão, portanto, gcc -lstdc++você ainda não terá o mesmo comportamento que g++. Colocamos todo esse comportamento específico de idioma em seu próprio driver por um motivo, é para isso que ele existe. :-)
Ti Strga
8
Meu comentário não está falando apenas de vincular ... esse é o ponto. Mesmo restringindo a discussão à vinculação (o que sua resposta não foi), o usuário ainda não poderá usar a biblioteca padrão C ++ inteira apenas especificando -lstdc++, pois haverá dependências ausentes em matemática, RTTI e informações de exceção. Se um determinado caso de teste vincula ou falha dependerá do sistema operacional e quais recursos C ++ são usados ​​pelo caso de teste, novamente é por isso que todo esse conhecimento é incorporado ao driver g ++, em vez de ser deixado ao usuário descobrir .
Ti Strga
10
Confie em mim, discutimos bastante, geralmente quando um usuário de Linux tenta mover seu Makefile incompleto para outra plataforma. :-) O estágio de link do g ++ faz muito mais do que gcc -lstdc++em outros sistemas operacionais, especialmente quando o destino é uma plataforma incorporada. Felizmente, é por isso que enviamos um g ++ em primeiro lugar.
Ti Strga
10
As strings de especificação são construídas para serem específicas para o compilador, que por sua vez são específicas para o sistema operacional e o destino. Portanto, se você executar -dumpspec(por exemplo) um compilador cruzado direcionado a um sistema incorporado, verá as diferenças. Existem mais do que apenas diferenças de vinculador ... qual foi a sua resposta (macros de pré-processador, incluem caminhos, várias bibliotecas de tempo de execução). Parece que estamos falando um do outro, mas como ex-mantenedor do GCC, garanto que estou familiarizado com o que os front-end são e o que não são.
Ti Strga
82

Para c ++, você deve usar g ++.

É o mesmo compilador (por exemplo, a coleção do compilador GNU). O GCC ou o G ++ apenas escolhe um front-end diferente com diferentes opções padrão.

Em poucas palavras: se você usar o g ++, o front-end dirá ao vinculador que você pode querer vincular às bibliotecas padrão do C ++. O frontend do gcc não fará isso (também poderá vincular a eles se você passar as opções corretas da linha de comando).

Nils Pipenbrinck
fonte
3
+1 Também minha página de manual gcc do GNU / Linux diz: "Ao compilar programas em C ++, você deve chamar o GCC como g ++."
Visualização elíptica
35

Qual é a diferença entre g++e gcc?

gccevoluiu de um único idioma "GNU C Compiler" para ser um "GNU Compiler Collection" em vários idiomas. O termo "Compilador GNU C" ainda é usado algumas vezes no contexto da programação C.

O g++ é o compilador C ++ para a GNU Compiler Collection. Like gnaté o compilador Ada para gcc. consulte Usando a coleção GNU Compiler Collection (GCC)

Por exemplo, o man g++comando Ubuntu 16.04 e 18.04 retorna a GCC(1)página de manual.

O Ubuntu 16.04 e 18.04 man gccafirma que ...

g++ aceita principalmente as mesmas opções que gcc

e que o padrão ...

... use of gccnão adiciona a biblioteca C ++. g++é um programa que chama o GCC e especifica automaticamente a vinculação à biblioteca C ++. Ele trata arquivos .c, .he .i como arquivos de origem C ++ em vez de arquivos de origem C, a menos que -x seja usado. Este programa também é útil ao pré-compilar um arquivo de cabeçalho C com uma extensão .h para uso em compilações em C ++.

Pesquise nas gccpáginas do manual para obter mais detalhes sobre as variações de opções entre gcce g++.

Qual deles deve ser usado para o desenvolvimento geral do c ++?

Tecnicamente, um gccou g++pode ser usado para o desenvolvimento geral do C ++ com as configurações de opção aplicáveis. No entanto, o g++comportamento padrão é naturalmente alinhado a um desenvolvimento C ++.

A página de manual do Ubuntu 18.04 adicionou o seguinte parágrafo:

A maneira usual de executar o GCC é executar o executável chamado gcc, ou machine-gccdurante a compilação cruzada, ou machine-gcc-versionexecutar uma versão específica do GCC. Ao compilar programas C ++, você deve chamar o GCC como g++alternativa.

l --marc l
fonte
21

Uma diferença notável é que, se você passar um .carquivo para o gcc, ele será compilado como C.

O comportamento padrão do g ++ é tratar os .carquivos como C ++ (a menos que -x cseja especificado).

njsf
fonte
19
(Tarde, mas para a posteridade). Como outras respostas apontaram, essa não é de modo algum "a única diferença notável", a menos que o leitor tenha uma definição distorcida de notabilidade.
underscore_d
16

Embora os comandos gcc e g ++ façam coisas muito semelhantes, o g ++ foi projetado para ser o comando que você chamaria para compilar um programa C ++; destina-se a fazer automaticamente a coisa certa.

Nos bastidores, eles são realmente o mesmo programa. Pelo que entendi, ambos decidem se compilar um programa como C ou C ++ com base na extensão do nome do arquivo. Ambos são capazes de vincular-se à biblioteca padrão C ++, mas somente o g ++ faz isso por padrão. Portanto, se você tiver um programa escrito em C ++ que não precise ser vinculado à biblioteca padrão, o gcc fará a coisa certa; mas então, o mesmo aconteceria com o g ++. Portanto, não há realmente nenhuma razão para não usar o g ++ para o desenvolvimento geral do C ++.

zaphod
fonte
12

Fiquei interessado no problema e realizei algumas experiências

  1. Encontrei essa descrição aqui , mas é muito curta.

  2. Então tentei experimentar o gcc.exe e o g ++. Exe na minha máquina Windows:

    $ g++ --version | head -n1 
    g++.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
    
    $ gcc --version | head -n1
    gcc.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
    
  3. Tentei compilar arquivos de teste simples c89, c99 e c ++ 1998 e funciona bem para mim com extensões corretas correspondentes ao idioma

    gcc -std=c99 test_c99.c
    gcc -std=c89 test_c89.c 
    g++ -std=c++98 test_cpp.cpp
    gcc -std=c++98 test_cpp.cpp
  4. Mas quando tento executar a ferramenta "gnu compiler collection" dessa maneira:

    $ gcc -std=c++98 test_cpp.c
    cc1.exe: warning: command line option '-std=c++98' is valid for C++/ObjC++ but not for C [enabled by default]
  5. Mas este ainda funciona sem erros

    $ gcc -x c++ -std=c++98 test_cpp.c
  6. E isso também

    $ g++ -std=c++0x test_cpp_11.cpp 

arquivos de teste ps

$ cat test_c89.c test_c99.c test_cpp.cpp

// C89 compatible file
int main()
{
    int x[] = {0, 2};
    return sizeof(x);
}

// C99 compatible file
int main()
{
    int x[] = {[1]=2};
    return sizeof(x);
}

// C++1998,2003 compatible file
class X{};
int main()
{
    X x;
    return sizeof(x);
}

// C++11
#include <vector>
enum class Color : int{red,green,blue}; // scoped enum
int main()
{
    std::vector<int> a {1,2,3}; // bracket initialization
    return 0;
}

Constatações:

  1. Se olhar para a árvore de processos, parece que o gcc e o g ++ são back-end para outras ferramentas, que no meu ambiente são: cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe

  2. O gcc funciona bem como metatool, se você tiver a extensão correta ou definir sinalizadores -std -x corretos. Veja isto

bruziuz
fonte
9

"GCC" é um termo abreviado comum para a Coleção GNU Compiler. Este é o nome mais geral para o compilador e o nome usado quando a ênfase está na compilação de programas C (como a abreviação anteriormente significava "GNU C Compiler").

Ao se referir à compilação C ++, é comum chamar o compilador "G ++". Como existe apenas um compilador, também é preciso chamá-lo de "GCC", independentemente do contexto da linguagem; no entanto, o termo "G ++" é mais útil quando a ênfase está na compilação de programas em C ++.

Você pode ler mais aqui .

Minh-Triet Pham Tran
fonte
0

Eu estava testando gcc e g ++ em um sistema linux. Usando MAKEFILE, eu posso definir o complementador usado pelo "GNU make". Eu testei com o chamado recurso de localização "memória dinâmica" de "C plus plus":

int main(){

int * myptr = new int;
* myptr = 1;
printf("myptr[0] is %i\n",*myptr);
return 0;
}

Somente o g ++ pode ser compilado com êxito no meu computador, enquanto o gcc reportará um erro

undefined reference to `operator new(unsigned long)'

Portanto, minha própria conclusão é que o gcc não suporta totalmente "C plus plus". Parece que escolher g ++ para arquivos de origem C ++ é uma opção melhor.

magicmax
fonte
Você precisa fazer dois trabalhos: 1. selecione o idioma 2. escolha alguma biblioteca suhch como libstdc ++
PersianGulf 18/17/17
-1

gcc e g ++ são ambos compiladores GNU. Ambos compilam c e c ++. A diferença é que para arquivos * .c o gcc o trata como um programa ac, e o g ++ o vê como um programa ac ++. Arquivos * .cpp são considerados programas c ++. c ++ é um superconjunto de ce a sintaxe é mais rigorosa, portanto, tenha cuidado com o sufixo.

Marcus Thornton
fonte
1
C ++ é uma linguagem diferente, não um superconjunto estrito de C; portanto, compilar com a linguagem de destino errada pode produzir resultados inesperados. Observe também que g++também interpretará .cccomo uma extensão de nome de arquivo somente em C ++.
underscore_d