Qual é a diferença entre g ++ e gcc?
Pergunta
O que é a diferença entre g ++ e gcc? Quais os que devem ser usados ??para c ++ geral de desenvolvimento?
Solução
gcc
e g++
são compilador-drivers do GNU Compiler Collection (que era era uma vez apenas o GNU C Compiler ).
Mesmo que eles automaticamente determinar quais backends (cc1
cc1plus
...) para chamar dependendo do tipo de arquivo, a menos que substituída com -x language
, eles têm algumas diferenças.
A diferença provavelmente mais importante em seus padrões é que as bibliotecas ligam contra automaticamente.
De acordo com a documentação on-line do GCC opções de link e como g ++ é invocado , g++
é equivalente a gcc -xc++ -lstdc++ -shared-libgcc
(o 1º é uma opção do compilador, o segundo dois são opções vinculador). Isto pode ser verificado executando tanto com a opção -v
(ele exibe o backend toolchain comandos a ser executado).
Outras dicas
GCC: GNU Compiler Collection
- Referrers para todos os diferentes idiomas que são suportados pelo compilador GNU.
gcc: GNU C Compiler
g ++: GNU C ++ Compiler
As principais diferenças:
- gcc irá compilar:.. Arquivos * .c / * CPP como C e C ++, respectivamente
- g ++ irá compilar:.. Arquivos * .c / * CPP, mas todos eles serão tratados como arquivos C ++
- Além disso, se você usar g ++ para ligar os arquivos objeto automaticamente ligações nas bibliotecas std C ++ (gcc não faz isso).
- gcc compilar arquivos C tem menos macros pré-definidas.
- gcc compilação de arquivos * ++ compilação * .c / *. CPP CPP e G tem alguns macros extras.
Macros extra ao compilar arquivos * .cpp:
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
Para c ++ você deve usar g ++.
É o mesmo compilador (por exemplo, o GNU Compiler Collection). GCC ou G ++ basta escolher um front-end diferente, com diferentes opções padrão.
Em poucas palavras: se você usar g ++ a interface irá informar o vinculador que você pode querer ligação com a bibliotecas padrão C ++. O frontend gcc não vai fazer isso (também pode ligar com eles, se você passar as opções de linha de comando direita).
O que é a diferença entre g++
e gcc
?
gcc
evoluiu de uma única língua "GNU C Compiler" para ser um multi-linguagem "GNU Compiler Collection". O termo "GNU C Compiler" ainda é usado às vezes no contexto de programação C.
O g++
é o compilador C ++ para o GNU Compiler Collection. Como gnat
é o compilador Ada para gcc
. consulte Usando o GNU Compiler Collection (GCC)
Por exemplo, o Ubuntu 16.04 e 18.04 comando man g++
retornos do GCC(1)
página manual.
O Ubuntu 16.04 e 18.04 estados man gcc
que ...
g++
aceita em sua maioria as mesmas opções quegcc
e que o padrão ...
... uso de
gcc
não adicionar a biblioteca C ++.g++
é um programa que chama GCC e automaticamente especifica ligando contra o C ++ biblioteca. Trata .c, .h e arquivos .I como C ++ arquivos de origem em vez de arquivos de origem C a menos que -x é usado. Este programa também é útil quando pré-compilação de um arquivo de cabeçalho C com uma extensão .h para uso em C ++ compilações.
Procure nas páginas man gcc
para mores informações sobre a opção de variações de gcc
e g++
.
Qual deve ser usado para c ++ geral de desenvolvimento?
Tecnicamente, quer gcc
ou g++
pode ser usado para o desenvolvimento geral C ++ com as configurações de opção aplicável. No entanto, o comportamento g++
padrão é naturalmente alinhado com um C ++ desenvolvimento.
A página man Ubuntu 18.04 aditado o seguinte parágrafo:
A maneira usual para executar GCC é para executar o chamado
gcc
executável oumachine-gcc
quando cross-compilação, oumachine-gcc-version
para executar uma versão específica do GCC. Quando você compilar programas em C ++, você deve invocar GCC comog++
vez.
A única diferença notável é que se você passar um .c
para gcc ele irá compilar como C, ao passo que g ++ sempre vai tratá-lo como C ++.
Embora o gcc e g ++ comandos fazem coisas parecidas, g ++ é projetado para ser o comando que você invocar para compilar um programa C ++; ele é destinado para fazer automaticamente a coisa certa.
Nos bastidores, eles são realmente o mesmo programa. Pelo que entendi, tanto decidir se a compilar um programa como C ou como C ++ com base na extensão do arquivo. Ambos são capazes de ligar contra a biblioteca padrão do C ++, mas apenas g ++ faz isso por padrão. Então se você tem um programa escrito em C ++ que não acontece com a necessidade de ligação com a biblioteca padrão, gcc vai acontecer para fazer a coisa certa; mas, em seguida, isso seria g ++. Portanto, não há realmente nenhuma razão para não usar g ++ para C ++ geral de desenvolvimento.
I tornou-se interessado no assunto e fazer algumas experiências
-
Eu encontrei essa descrição aqui , mas é muito curto.
-
Então eu tentei experimentar com gcc.exe e 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
-
Eu tentei compilar C89, C99, e C ++ 1998 arquivos simples de teste e é um trabalho bem para mim com extensões corretas correspondentes para a linguagem
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
-
Mas quando tento executar "gnu Compiler Collection" ferramenta 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]
-
Mas este ainda trabalho sem erros
$ gcc -x c++ -std=c++98 test_cpp.c
-
E isso também
$ g++ -std=c++0x test_cpp_11.cpp
P.S. arquivos de teste
$ 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;
}
Resultados:
-
Se olhar para árvore de processos, então parece que gcc e g ++ é backend para outras ferramentas, que no meu ambiente são: cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe
-
gcc funciona bem como metatool para se você tem extensão correta ou conjunto correto bandeiras -x -std. Consulte este
“GCC” é um termo taquigráfico comum para o GNU Compiler Collection. Este é o nome geral mais para o compilador, eo nome usado quando a ênfase está na compilação de programas C (como a abreviatura antigamente significava “GNU C Compiler”).
Ao se referir a compilação C ++, é usual chamar o compilador “G ++”. Uma vez que existe apenas um compilador, também é preciso chamá-lo “GCC” não importa o contexto da linguagem; no entanto, o termo “G ++” é mais útil quando a ênfase está na compilação de programas C ++.
Você pode ler mais aqui .
Eu estava testando gcc e g ++ em um sistema Linux. Usando MAKEFILE, posso definir o compliler usado por "GNU make". Eu testei com a chamada "memória dinâmica" característica do "C plus plus" localizar por:
int main(){
int * myptr = new int;
* myptr = 1;
printf("myptr[0] is %i\n",*myptr);
return 0;
}
Apenas g ++ pode compilar com sucesso no meu computador enquanto gcc irá relatar erro
undefined reference to `operator new(unsigned long)'
Assim, a minha própria conclusão é gcc não suporta totalmente "C plus plus". Parece que a escolha g ++ para arquivos de origem C ++ é uma opção melhor.
gcc e g ++ são ambos compilador GNU. Ambos compilação C e C ++. A diferença é para arquivos * .c gcc trata como um programa c e g ++ vê-lo como um programa c ++. * arquivos .cpp são considerados programas em C ++. c ++ é um conjunto de super c e a sintaxe é mais rigorosa, por isso tenha cuidado sobre o sufixo.