Kompilieren eines C ++ - Programms mit gcc

84

Frage: Wie kompiliere ich ein C ++ - Programm mit dem gcc-Compiler?

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;
}

und wenn ich versuche zu kompilieren 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

Kann der gcc-Compiler keine C ++ - Programme kompilieren? Was ist der Unterschied zwischen gcc und g ++? Vielen Dank,

xyz
quelle
Mögliches Duplikat von Was ist der Unterschied zwischen g ++ und gcc?
underscore_d

Antworten:

135

gcc kann tatsächlich gut C ++ - Code kompilieren. Die Fehler, die Sie erhalten haben, sind Linkerfehler , keine Compilerfehler.

Wenn Sie die Kompilierungszeile so ändern, ist dies wahrscheinlich:

gcc info.C -lstdc++

Dadurch wird es mit der Standard-C ++ - Bibliothek verknüpft, und es funktioniert einwandfrei.

Sie sollten jedoch Ihr Leben einfacher machen und g ++ verwenden.


BEARBEITEN:

Rup sagt es am besten in seinem Kommentar zu einer anderen Antwort:

[...] gcc wählt den richtigen Back-End-Compiler basierend auf der Dateierweiterung aus (dh kompiliert eine .c als C und eine .cc als C ++) und verknüpft Binärdateien standardmäßig nur mit den Standard-C- und GCC-Hilfsbibliotheken, unabhängig davon Eingabesprachen; g ++ wählt auch das richtige Back-End basierend auf der Erweiterung aus, außer dass es meiner Meinung nach alle C-Quellen stattdessen als C ++ kompiliert (dh es kompiliert sowohl .c als auch .cc als C ++) und libstdc ++ unabhängig von den Eingabesprachen in seinen Verknüpfungsschritt einbezieht.

Evan Teran
quelle
41

Wenn Sie dem Code die Erweiterung .c geben, glaubt der Compiler, dass es sich um C-Code handelt, nicht um C ++. Der C ++ - Compilertreiber heißt g ++. Wenn Sie den gcc-Treiber verwenden, treten Linkerprobleme auf, da die Standard-C ++ - Bibliotheken standardmäßig nicht verknüpft werden. Also du möchtest:

g++ myprog.cpp

Und denken Sie nicht einmal daran, eine .C-Erweiterung in Großbuchstaben zu verwenden, es sei denn, Sie möchten Ihren Code niemals portieren und sind bereit, von denen gehasst zu werden, mit denen Sie arbeiten.


quelle
@Neil: Nach allem, was ich sagen kann, betrachtet gcc eine .C( Groß- ) Erweiterung als eine C ++ - Erweiterung. Folgendes funktioniert einwandfrei: gcc test.C -lstdc++ -o testoder g++ test.C -o test.
Evan Teran
3
@Evan Ja, natürlich. Das bedeutet jedoch nicht, dass Sie es jemals verwenden sollten, da es schreckliche Portabilitätsprobleme verursachen wird, ebenso wie alle Dateinamen, bei denen zwischen Groß- und Kleinschreibung unterschieden wird. Die Erweiterung für C ++ - Dateien sollte immer .cpp sein. Dies verursacht keine Probleme und funktioniert garantiert auf allen gängigen Betriebssystemen.
26

verwenden g++statt gcc.

Alexandre C.
quelle
1
Kannst du erklären warum?
Noraj
12

Standardmäßig wählt gcc die Sprache basierend auf der Dateierweiterung aus. Sie können gcc jedoch zwingen, mit der Option -x ein anderes Sprach-Backend auszuwählen:

gcc -x c++

Weitere Optionen finden Sie in der gcc-Manpage unter "Optionen zur Steuerung der Art der Ausgabe". Siehe z. B. http://linux.die.net/man/1/gcc (suchen Sie auf der Seite nach dem Text -x language).

Diese Funktion ist sehr nützlich in Fällen, in denen gcc die Sprache mithilfe einer Dateierweiterung nicht erraten kann, z. B. wenn Sie Code generieren und ihn über stdin an gcc weitergeben.

Bleater
quelle
11

Der Unterschied zwischen gcc und g ++ ist:

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

Verwenden Sie g ++ anstelle von gcc, um Ihre C ++ - Quelle zu kompilieren.

Praveen S.
quelle
16
Es ist etwas komplizierter als das, wie in den anderen Antworten hier. gcc wählt den richtigen Back-End-Compiler basierend auf der Dateierweiterung aus (dh kompiliert eine .c als C und eine .cc als C ++) und verknüpft Binärdateien standardmäßig nur mit den Standard-C- und GCC-Hilfsbibliotheken, unabhängig von den Eingabesprachen. g ++ wählt auch das richtige Back-End basierend auf der Erweiterung aus, außer dass es meiner Meinung nach alle C-Quellen stattdessen als C ++ kompiliert (dh es kompiliert sowohl .c als auch .cc als C ++) und libstdc ++ unabhängig von den Eingabesprachen in seinen Verknüpfungsschritt einbezieht.
Rup
1
@ Rup: ​​Richtig, das habe ich im Grunde in meiner Antwort gesagt.
Evan Teran
1

Wenn ich mich richtig erinnere, bestimmt gcc den Dateityp aus dem Suffix. Also, mach es foo.cc und es sollte funktionieren.

Und um Ihre andere Frage zu beantworten, das ist der Unterschied zwischen "gcc" und "g ++". gcc ist ein Frontend, das den richtigen Compiler auswählt.

Borealid
quelle
1

Es hat gut für mich funktioniert. Nur ein Zeilencode in cmd.

Stellen Sie zunächst sicher , dass Sie den Compiler gcc (für c) oder g ++ (für c ++) installiert haben .

In cmd für gcc Typ:

gcc --version

in cmd für g ++ Typ:

g ++ --version

Wenn es installiert ist, fahren Sie fort.

Kompilieren Sie nun Ihre .c oder .cpp mit cmd

für .c- Syntax:

gcc -o exe_filename yourfilename.c

Beispiel:

gcc -o myfile myfile.c

Hier ist exe_filename (Beispiel myfile) der Name Ihrer EXE-Datei, die Sie nach der Kompilierung erstellen möchten (Hinweis: Ich habe hier keine Erweiterung eingefügt). Und yourfilename.c (im Beispiel myfile.c) ist Ihre Quelldatei mit der Erweiterung .c.

Gehen Sie nun zu einem Ordner mit Ihrer .c-Datei. Hier finden Sie eine Datei mit der Erweiterung .exe. Öffne es einfach. Hurra..

Für die CPP- Syntax:

g ++ -o exe_filename yourfilename.cpp

Danach ist der Vorgang der gleiche wie für .c.

Rajkumar Bansal
quelle
2
Die Frage war "Wie kompiliere ich ein C ++ - Programm mit dem gcc-Compiler?" nicht "Wie kompiliere ich ein C-Programm mit dem gcc-Compiler? Oder wie kompiliere ich ein C ++ - Programm mit dem g ++ - Compiler?"
DevX
Schöner Fang! @ DevX
Rajkumar Bansal