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 ( cc1cc1plus...) 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).
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:
gccirá compilar: *.c\*.cppfiles como C e C ++, respectivamente.
g++irá compilar: *.c\*.cppfiles, mas todos serão tratados como arquivos C ++.
Além disso, se você usar g++para vincular os arquivos de objeto, ele vinculará automaticamente nas bibliotecas std C ++ ( gccnão faz isso).
gcc compilar arquivos C possui menos macros predefinidas.
gcccompilar *.cppe g++compilar *.c\*.cpparquivos possui algumas macros extras.
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).
+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.
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 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.
(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 ++.
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
O gcc funciona bem como metatool, se você tiver a extensão correta ou definir sinalizadores -std -x corretos. Veja isto
"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 ++.
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 =newint;* myptr =1;
printf("myptr[0] is %i\n",*myptr);return0;}
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.
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.
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 ++.
Respostas:
gcc
eg++
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 agcc -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-v
opção (ele exibe os comandos de cadeia de ferramentas de back-end em execução).fonte
argv[0]
qual invocação deve ser usada. Isso é bastante comum entre os principais utilitários UNIX.GCC: Coleção GNU Compiler
gcc
: Compiladorg++
GNU C: Compilador GNU C ++As principais diferenças:
gcc
irá compilar:*.c\*.cpp
files como C e C ++, respectivamente.g++
irá compilar:*.c\*.cpp
files, mas todos serão tratados como arquivos C ++.g++
para vincular os arquivos de objeto, ele vinculará automaticamente nas bibliotecas std C ++ (gcc
não faz isso).gcc
compilar arquivos C possui menos macros predefinidas.gcc
compilar*.cpp
eg++
compilar*.c\*.cpp
arquivos possui algumas macros extras.Macros extras ao compilar
*.cpp
arquivos:fonte
gcc
passando o-lstdc++
parâmetrogcc -lstdc++
você ainda não terá o mesmo comportamento queg++
. Colocamos todo esse comportamento específico de idioma em seu próprio driver por um motivo, é para isso que ele existe. :-)-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 .gcc -lstdc++
em outros sistemas operacionais, especialmente quando o destino é uma plataforma incorporada. Felizmente, é por isso que enviamos um g ++ em primeiro lugar.-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.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).
fonte
Qual é a diferença entre
g++
egcc
?gcc
evoluiu 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. Likegnat
é o compilador Ada paragcc
. consulte Usando a coleção GNU Compiler Collection (GCC)Por exemplo, o
man g++
comando Ubuntu 16.04 e 18.04 retorna aGCC(1)
página de manual.O Ubuntu 16.04 e 18.04
man gcc
afirma que ...e que o padrão ...
Pesquise nas
gcc
páginas do manual para obter mais detalhes sobre as variações de opções entregcc
eg++
.Qual deles deve ser usado para o desenvolvimento geral do c ++?
Tecnicamente, um
gcc
oug++
pode ser usado para o desenvolvimento geral do C ++ com as configurações de opção aplicáveis. No entanto, og++
comportamento padrão é naturalmente alinhado a um desenvolvimento C ++.A página de manual do Ubuntu 18.04 adicionou o seguinte parágrafo:
fonte
Uma diferença notável é que, se você passar um
.c
arquivo para o gcc, ele será compilado como C.O comportamento padrão do g ++ é tratar os
.c
arquivos como C ++ (a menos que-x c
seja especificado).fonte
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 ++.
fonte
Fiquei interessado no problema e realizei algumas experiências
Encontrei essa descrição aqui , mas é muito curta.
Então tentei experimentar o gcc.exe e o g ++. Exe na minha máquina Windows:
Tentei compilar arquivos de teste simples c89, c99 e c ++ 1998 e funciona bem para mim com extensões corretas correspondentes ao idioma
Mas quando tento executar a ferramenta "gnu compiler collection" dessa maneira:
Mas este ainda funciona sem erros
E isso também
arquivos de teste ps
Constatações:
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
O gcc funciona bem como metatool, se você tiver a extensão correta ou definir sinalizadores -std -x corretos. Veja isto
fonte
"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 .
fonte
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":
Somente o g ++ pode ser compilado com êxito no meu computador, enquanto o gcc reportará um erro
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.
fonte
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.
fonte
g++
também interpretará.cc
como uma extensão de nome de arquivo somente em C ++.