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,


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.


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.


@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.


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.


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.


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.


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.