Kompilowanie programu w C ++ za pomocą gcc

88

Pytanie: Jak skompilować program w C ++ za pomocą kompilatora gcc?

info.c:

#include<iostream>
using std::cout;
using std::endl;
int main()
{
   #ifdef __cplusplus
   cout << "C++ compiler in use and version is " << __cplusplus << endl;
   #endif
   cout <<"Version is " << __STDC_VERSION__ << endl;
   cout << "Hi" << __FILE__ << __LINE__ << endl;
}

i kiedy próbuję skompilować info.c

$ gcc info.C

Undefined                       first referenced
 symbol                             in file
cout                                /var/tmp/ccPxLN2a.o
endl(ostream &)                     /var/tmp/ccPxLN2a.o
ostream::operator<<(ostream &(*)(ostream &))/var/tmp/ccPxLN2a.o
ostream::operator<<(int)            /var/tmp/ccPxLN2a.o
ostream::operator<<(long)           /var/tmp/ccPxLN2a.o
ostream::operator<<(char const *)   /var/tmp/ccPxLN2a.o
ld: fatal: Symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status

Czy kompilator gcc nie jest w stanie kompilować programów w języku C ++? A propos, jaka jest różnica między gcc i g ++. Dzięki,

xyz
źródło
Możliwy duplikat Jaka jest różnica między g ++ i gcc?
underscore_d

Odpowiedzi:

138

gcc może właściwie dobrze skompilować kod C ++. Otrzymane błędy to błędy konsolidatora , a nie błędy kompilatora.

Szanse są takie, że jeśli zmienisz wiersz kompilacji na taki:

gcc info.C -lstdc++

co sprawia, że ​​jest to link do standardowej biblioteki c ++, wtedy będzie działać dobrze.

Jednak powinieneś po prostu ułatwić sobie życie i użyć g ++.


EDYTOWAĆ:

Rup mówi to najlepiej w swoim komentarzu do innej odpowiedzi:

[...] gcc wybierze poprawny kompilator zaplecza na podstawie rozszerzenia pliku (tj. skompiluje .c jako C i .cc jako C ++) i połączy pliki binarne tylko ze standardowymi bibliotekami pomocniczymi C i GCC, niezależnie od języki wejściowe; g ++ wybierze również poprawne zaplecze oparte na rozszerzeniu, z wyjątkiem tego, że myślę, że zamiast tego kompiluje całe źródło C jako C ++ (tj. kompiluje zarówno .c, jak i .cc jako C ++) i zawiera libstdc ++ w swoim kroku łączenia, niezależnie od języków wejściowych.

Evan Teran
źródło
42

Jeśli nadasz kodowi rozszerzenie .c, kompilator uzna, że ​​jest to kod w C, a nie C ++. A sterownik kompilatora C ++ nazywa się g ++, jeśli użyjesz sterownika gcc, będziesz miał problemy z konsolidatorem, ponieważ standardowe biblioteki C ++ nie będą domyślnie połączone. Więc chcesz:

g++ myprog.cpp

I nawet nie rozważaj używania rozszerzenia .C pisanego wielkimi literami, chyba że nigdy nie chcesz przenosić swojego kodu i jesteś przygotowany na nienawiść przez tych, z którymi pracujesz.


źródło
@Neil: z tego, co wiem, gcc uważa .C(duże) rozszerzenie za rozszerzenie c ++. Następujące działa dobrze: gcc test.C -lstdc++ -o testlub g++ test.C -o test.
Evan Teran,
3
@Evan Tak, oczywiście, że tak. Nie oznacza to jednak, że powinieneś go kiedykolwiek używać, ponieważ spowoduje to straszne problemy z przenośnością, podobnie jak wszystkie nazwy plików z rozróżnianiem wielkości liter. Rozszerzenie dla plików C ++ powinno zawsze mieć format .cpp. Nie powoduje to żadnych problemów i gwarantuje działanie we wszystkich popularnych systemach operacyjnych.
27

użyj g++zamiast gcc.

Alexandre C.
źródło
2
Czy możesz mi wytłumaczyć dlaczego?
noraj
12

Domyślnie gcc wybiera język na podstawie rozszerzenia pliku, ale możesz zmusić gcc do wybrania innego języka za pomocą opcji -x, w ten sposób:

gcc -x c++

Więcej opcji jest szczegółowo opisanych na stronie podręcznika gcc w sekcji „Opcje kontrolujące rodzaj wyjścia”. Zobacz np. Http://linux.die.net/man/1/gcc (szukaj tekstu na stronie -x language).

Ta funkcja jest bardzo przydatna w przypadkach, gdy gcc nie może odgadnąć języka przy użyciu rozszerzenia pliku, na przykład jeśli generujesz kod i podajesz go do gcc przez stdin.

bleater
źródło
11

Różnica między gcc i g ++ to:

     gcc            |        g++
compiles c source   |   compiles c++ source

użyj g ++ zamiast gcc do skompilowania źródła c ++.

Praveen S
źródło
16
To trochę bardziej skomplikowane, tak jak w przypadku innych odpowiedzi tutaj. gcc wybierze poprawny kompilator zaplecza w oparciu o rozszerzenie pliku (tj. skompiluje .c jako C i .cc jako C ++) i połączy pliki binarne tylko ze standardowymi bibliotekami pomocniczymi C i GCC, niezależnie od języków wejściowych; g ++ wybierze również poprawne zaplecze oparte na rozszerzeniu, z wyjątkiem tego, że myślę, że zamiast tego kompiluje całe źródło C jako C ++ (tj. kompiluje zarówno .c, jak i .cc jako C ++) i zawiera libstdc ++ w swoim kroku łączenia, niezależnie od języków wejściowych.
Rup
1
@Rup: zgadza się, to w zasadzie to, co powiedziałem w mojej odpowiedzi.
Evan Teran,
1

Jeśli dobrze pamiętam, gcc określa typ pliku na podstawie przyrostka. Więc zrób to foo.cc i powinno działać.

Odpowiadając na inne pytanie, na tym polega różnica między „gcc” a „g ++”. gcc to nakładka, która wybiera właściwy kompilator.

Borealid
źródło
0

U mnie to zadziałało. Tylko jeden kod liniowy w cmd.

Najpierw upewnij się, że zainstalowałeś kompilator gcc (dla c) lub g ++ (dla c ++).

W cmd dla typu gcc:

gcc --version

w cmd dla typu g ++:

g ++ --version

Jeśli jest zainstalowany, kontynuuj.

Teraz skompiluj swój plik .c lub .cpp za pomocą cmd

dla składni .c :

gcc -o exe_filename yourfilename.c

Przykład:

gcc -o mojplik mojplik.c

Tutaj exe_filename (w przykładzie myfile) to nazwa twojego pliku .exe, który chcesz utworzyć po kompilacji (Uwaga: nie wstawiłem tutaj żadnego rozszerzenia). A twoja nazwa pliku.c (na przykład mojplik.c) to twój plik źródłowy, który ma rozszerzenie .c.

Teraz przejdź do folderu zawierającego plik .c, tutaj znajdziesz plik z rozszerzeniem .exe. Po prostu otwórz. Hurra..

Dla składni .cpp :

g ++ -o exe_filename yourfilename.cpp

Po tym proces jest taki sam, jak w przypadku .c.

Rajkumar Bansal
źródło
2
Pytanie brzmiało „Jak skompilować program w C ++ za pomocą kompilatora gcc?” not „Jak skompilować program w C za pomocą kompilatora gcc? lub Jak skompilować program w C ++ za pomocą kompilatora g ++?”
DevX
Dobry chwyt! @DevX
Rajkumar Bansal