Jaka jest różnica między g ++ a gcc? Który z nich powinien być użyty do ogólnego programowania w C ++?
Jaka jest różnica między g ++ a gcc? Który z nich powinien być użyty do ogólnego programowania w C ++?
Odpowiedzi:
gcc
i g++
są sterownikami kompilatora z kolekcji kompilatora GNU (która kiedyś była tylko kompilatorem GNU C ).
Mimo że automatycznie określają, które backendy ( cc1
cc1plus
...) mają być wywoływane w zależności od typu pliku, o ile nie zostaną zastąpione -x language
, mają pewne różnice.
Prawdopodobnie najważniejsza różnica w ustawieniach domyślnych polega na tym, z którymi bibliotekami łączą się automatycznie.
Według internetowych GCC w dokumentacji opcji łącza i jak g ++ jest wywoływana , g++
jest równoważna gcc -xc++ -lstdc++ -shared-libgcc
(1st jest opcja kompilatora, 2. dwie opcje łącznik). Można to sprawdzić, uruchamiając oba z -v
opcją (wyświetla uruchamiane polecenia łańcucha narzędzi zaplecza).
argv[0]
które wywołanie powinno zostać użyte. Jest to dość powszechne wśród podstawowych narzędzi UNIX.
GCC: Kolekcja kompilatora GNU
gcc
: Kompilator
g++
GNU C: Kompilator GNU C ++
Główne różnice:
gcc
skompiluje: *.c\*.cpp
pliki odpowiednio jako C i C ++.g++
skompiluje: *.c\*.cpp
pliki, ale wszystkie będą traktowane jak pliki C ++.g++
do łączenia plików obiektowych, automatycznie łączy się w bibliotekach std C ++ ( gcc
nie robi tego).gcc
kompilacja plików C ma mniej predefiniowanych makr.gcc
kompilowanie *.cpp
i g++
kompilowanie *.c\*.cpp
plików ma kilka dodatkowych makr.Dodatkowe makra podczas kompilacji *.cpp
plików:
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
gcc
, przekazując -lstdc++
parametr.
gcc -lstdc++
nadal nie zapewnisz takiego samego zachowania jak g++
. Z tego powodu umieściliśmy wszystkie te zachowania specyficzne dla języka we własnym sterowniku. :-)
-lstdc++
, ponieważ będzie brakowało zależności od matematyki, RTTI i informacji o wyjątkach. To, czy dana skrzynka testowa zostanie połączona, czy nie, będzie zależeć od systemu operacyjnego i od tego, jakie funkcje C ++ są używane przez skrzynkę testową, i znowu dlatego cała ta wiedza jest wbudowana w sterownik g ++, a nie pozostawiona użytkownikowi. .
gcc -lstdc++
w innych systemach operacyjnych, szczególnie gdy celem jest platforma osadzona. Na szczęście właśnie dlatego wysyłamy g ++.
-dumpspec
(na przykład) kompilator krzyżowy ukierunkowany na system osadzony, zobaczysz różnice. Istnieją nie tylko różnice między linkerami ... i znowu o to ci chodziło (makra preprocesora, zawierają ścieżki, wiele bibliotek wykonawczych). Wygląda na to, że rozmawiamy obok siebie, ale jako były opiekun GCC zapewniam cię, że wiem, jakie są nakładki, a jakie nie.
W przypadku c ++ należy użyć g ++.
To ten sam kompilator (np. Kolekcja kompilatora GNU). GCC lub G ++ wystarczy wybrać inny interfejs z różnymi opcjami domyślnymi.
W skrócie: jeśli używasz g ++, frontend powie linkerowi, że możesz chcieć połączyć się ze standardowymi bibliotekami C ++. Frontend gcc tego nie zrobi (może również połączyć się z nimi, jeśli podasz odpowiednie opcje wiersza poleceń).
Jaka jest różnica między g++
i gcc
?
gcc
ewoluował z jednego języka „Kompilator GNU C” w wielojęzyczny „Zbiór kompilatorów GNU”. Termin „kompilator GNU C” jest nadal używany czasami w kontekście programowania C.
Jest g++
to kompilator C ++ dla kolekcji kompilatorów GNU. Podobnie gnat
jak kompilator Ada gcc
. zobacz Korzystanie z kolekcji kompilatora GNU (GCC)
Na przykład polecenie Ubuntu 16.04 i 18.04 man g++
zwraca GCC(1)
stronę podręcznika.
Ubuntu 16.04 i 18.04 man gcc
stwierdza, że ...
g++
akceptuje głównie takie same opcje jakgcc
i że domyślnie ...
... użycie
gcc
nie dodaje biblioteki C ++.g++
to program, który wywołuje GCC i automatycznie określa łączenie z biblioteką C ++. Traktuje pliki .c, .h i .i jako pliki źródłowe C ++ zamiast plików źródłowych C, chyba że użyto opcji -x. Ten program jest także przydatny podczas wstępnej kompilacji pliku nagłówka C z rozszerzeniem .h do użycia w kompilacjach C ++.
Przeszukaj strony podręcznika, gcc
aby uzyskać więcej informacji na temat wariancji opcji między gcc
i g++
.
Którego należy użyć do ogólnego programowania w C ++?
Technicznie, albo gcc
albo g++
może być użyty do ogólnego programowania w C ++ z odpowiednimi ustawieniami opcji. Jednak g++
domyślne zachowanie jest naturalnie dostosowane do rozwoju C ++.
Stronę Ubuntu 18.04 człowiek dodany następujący akapit:
Typowym sposobem uruchomienia GCC jest uruchomienie pliku wykonywalnego o nazwie
gcc
lubmachine-gcc
podczas kompilacji krzyżowej lubmachine-gcc-version
uruchomienie określonej wersji GCC. Kiedy kompilujesz programy C ++, powinieneś wywołać GCC asg++
.
Istotną różnicą jest to, że jeśli przekażesz .c
plik do gcc, skompiluje się jako C.
Domyślne zachowanie g ++ polega na traktowaniu .c
plików jak C ++ (chyba że -x c
podano inaczej ).
Chociaż polecenia gcc i g ++ robią bardzo podobne rzeczy, g ++ jest zaprojektowane jako polecenie, które można wywołać w celu skompilowania programu w C ++; jest przeznaczony do automatycznego robienia właściwych rzeczy.
Za kulisami są to naprawdę ten sam program. Jak rozumiem, obaj decydują, czy skompilować program jako C czy jako C ++ na podstawie rozszerzenia nazwy pliku. Oba są w stanie łączyć się ze standardową biblioteką C ++, ale domyślnie robi to tylko g ++. Więc jeśli masz program napisany w C ++, który nie musi się łączyć ze standardową biblioteką, gcc zrobi właściwą rzecz; ale wtedy też g ++. Tak naprawdę nie ma powodu, aby nie używać g ++ do ogólnego programowania w C ++.
Zainteresowałem się tym problemem i przeprowadziłem kilka eksperymentów
Znalazłem ten opis tutaj , ale jest bardzo krótki.
Następnie próbowałem eksperymentować z gcc.exe i g ++. Exe na moim komputerze z systemem 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
Próbowałem skompilować proste pliki testowe c89, c99 i c ++ 1998 i działa dobrze dla mnie z poprawnymi rozszerzeniami pasującymi do języka
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
Ale kiedy próbuję uruchomić narzędzie „kolekcja kompilatora GNU” w ten sposób:
$ 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]
Ale ten nadal działa bez błędów
$ gcc -x c++ -std=c++98 test_cpp.c
I to też
$ g++ -std=c++0x test_cpp_11.cpp
ps Pliki testowe
$ 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;
}
Wyniki:
Jeśli spojrzymy na drzewo procesów, to wydaje się, że gcc i g ++ to backend do innych narzędzi, które w moim środowisku to: cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe
gcc działa dobrze jako metatool, jeśli masz poprawne rozszerzenie lub ustawiłeś poprawne flagi -std -x. Zobacz to
„GCC” jest powszechnym terminem określającym kolekcję kompilatorów GNU. Jest to zarówno najbardziej ogólna nazwa kompilatora, jak i nazwa używana, gdy nacisk kładziony jest na kompilowanie programów w C (jak wcześniej skrót oznaczał „GNU C Compiler”).
Odnosząc się do kompilacji w C ++, zwykle nazywa się kompilator „G ++”. Ponieważ istnieje tylko jeden kompilator, można go nazwać „GCC” bez względu na kontekst językowy; termin „G ++” jest jednak bardziej przydatny, gdy nacisk kładziony jest na kompilowanie programów w C ++.
Możesz przeczytać więcej tutaj .
Testowałem gcc i g ++ w systemie linux. Używając MAKEFILE, mogę zdefiniować kompilator używany przez „GNU make”. Testowałem z tak zwaną funkcją lokalizacji „pamięci dynamicznej” „C plus plus” przez:
int main(){
int * myptr = new int;
* myptr = 1;
printf("myptr[0] is %i\n",*myptr);
return 0;
}
Tylko g ++ może pomyślnie skompilować na moim komputerze, podczas gdy gcc zgłasza błąd
undefined reference to `operator new(unsigned long)'
Więc mój wniosek jest taki, że gcc nie obsługuje w pełni „C plus plus”. Wydaje się, że wybranie g ++ dla plików źródłowych C ++ jest lepszą opcją.
gcc i g ++ są kompilatorami GNU. Obie kompilują c oraz c ++. Różnica polega na tym, że pliki * .c gcc traktuje to jako program ac, a g ++ traktuje to jako program ac ++. Pliki * .cpp są uważane za programy c ++. c ++ to super zestaw c, a składnia jest bardziej rygorystyczna, więc uważaj na sufiks.
g++
będzie to również interpretować .cc
jako rozszerzenie pliku tylko do C ++.