Qual é a diferença entre g ++ e gcc? Qual deles deve ser usado para o desenvolvimento geral do c ++?
Qual é a diferença entre g ++ e gcc? Qual deles deve ser usado para o desenvolvimento geral do c ++?
Respostas:
gcc
e 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 -v
opção (ele exibe os comandos de cadeia de ferramentas de back-end em execução).
argv[0]
qual invocação deve ser usada. Isso é bastante comum entre os principais utilitários UNIX.
GCC: Coleção GNU Compiler
gcc
: Compilador
g++
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
e g++
compilar *.c\*.cpp
arquivos possui algumas macros extras.Macros extras ao compilar *.cpp
arquivos:
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
gcc
passando o -lstdc++
parâmetro
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. :-)
-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).
Qual é a diferença entre g++
e gcc
?
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. 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 gcc
afirma que ...
g++
aceita principalmente as mesmas opções quegcc
e que o padrão ...
... use of
gcc
nã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 gcc
páginas do manual para obter mais detalhes sobre as variações de opções entre gcc
e g++
.
Qual deles deve ser usado para o desenvolvimento geral do c ++?
Tecnicamente, um gcc
ou 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
, oumachine-gcc
durante a compilação cruzada, oumachine-gcc-version
executar uma versão específica do GCC. Ao compilar programas C ++, você deve chamar o GCC comog++
alternativa.
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).
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 ++.
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:
$ 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
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
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]
Mas este ainda funciona sem erros
$ gcc -x c++ -std=c++98 test_cpp.c
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:
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 ++.
Você pode ler mais aqui .
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.
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.
g++
também interpretará .cc
como uma extensão de nome de arquivo somente em C ++.