2010-07-05 5 views
40

Question: Comment compiler un programme C++ avec le compilateur gcc?compilant un programme C++ avec 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; 
} 

et quand je tente de compiler 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 

est pas compilateur gcc capable de compiler des programmes C++? Sur une note connexe, quelle est la différence entre gcc et g ++. Merci,

+0

Copie possible de [Quelle est la différence entre g ++ et gcc?] (Https://stackoverflow.com/questions/172587/what-is-the-difference-between-g-and-gcc) –

Répondre

77

gcc peut réellement compiler le code C++ très bien. Les erreurs que vous avez reçues sont erreurs linker, pas des erreurs du compilateur.

Les chances sont que si vous modifiez la ligne de compilation pour être ceci:

gcc info.C -lstdc++ 

ce qui en fait un lien vers la bibliothèque C++ standard, il fonctionne très bien.

Cependant, vous devez simplement vous rendre la vie plus facile et utiliser g ++.


EDIT:

Rup dit qu'il valait mieux en his comment à une autre réponse:

[...] gcc sélectionner le compilateur back-end correct basé sur fichier extension (ie va compiler un .c comme C et a.cc comme C++) et lie les binaires par rapport aux bibliothèques d'aide standard C et GCC par par défaut, quelle que soit la langue d'entrée; g ++ sélectionnera aussi que je pense que le correct back-end basé sur l'extension à l'exception compile toutes les sources C comme C++ au lieu (il compile à la fois .c et .cc en C++) et comprend libstdC++ dans son lien étape indépendamment des langues d'entrée.

15

utilisez g++ au lieu de gcc.

1

Si je me souviens bien, gcc détermine le type de fichier du suffixe. Alors, faites-le foo.cc et ça devrait marcher.

Et, pour répondre à votre autre question, que est la différence entre "gcc" et "g ++". gcc est une interface qui choisit le compilateur correct.

29

Si vous donnez le code une extension .c le compilateur pense qu'il est le code C, C++ non. Et le pilote du compilateur C++ est appelé g ++, si vous utilisez le pilote gcc, vous aurez des problèmes de liens, car les bibliothèques C++ standard ne seront pas liées par défaut. Donc, vous voulez:

g++ myprog.cpp 

Et ne considérez pas même en utilisant une extension .C en majuscules, à moins que vous ne voulez jamais au port de votre code, et sont prêts à être haï par ceux que vous travaillez.

+0

@Neil: D'après ce que je peux dire, gcc considère une extension '.C' (capital) comme une extension C++. Ce qui suit fonctionne très bien: 'gcc test.C -lstdC++ -o test' ou' g ++ test.C -o test'. –

+2

@Evan Oui, bien sûr que oui. Cela ne veut pas dire que vous devriez l'utiliser, car cela causera de terribles problèmes de portabilité, comme tous les noms de fichiers sensibles à la casse. L'extension pour les fichiers C++ doit toujours être .cpp. Cela ne pose aucun problème et fonctionne sur tous les systèmes d'exploitation courants. –

4

La différence entre gcc et g ++ sont:

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

utilisation g ++ au lieu de gcc pour vous compiler C++ la source.

+11

C'est un peu plus compliqué que ça, comme dans les autres réponses ici. gcc sélectionnera le compilateur dorsal correct basé sur l'extension de fichier (c'est-à-dire compilera un .c comme C et un .cc comme C++) et reliera les binaires par rapport aux bibliothèques d'aide standard C et GCC par défaut indépendamment des langues d'entrée; g ++ sélectionne également le back-end correct basé sur l'extension sauf que je pense qu'il compile toutes les sources C en C++ (c'est-à-dire qu'il compile à la fois .c et .cc en C++) et il inclut libstdC++ dans son étape de liaison sans tenir compte des langues d'entrée. – Rup

+0

@Rup: c'est exact, c'est ce que je disais dans ma réponse. –

2

Vous pouvez forcer gcc pour sélectionner un back-end de langue avec l'option -x ainsi:

gcc -x c++ 

Plus d'options sont détaillées dans la page de manuel gcc sous. Voir par exemple Cette fonctionnalité est très utile dans les cas où gcc ne peut pas deviner la langue à l'aide d'une extension de fichier, par exemple si vous générez du code et l'alimentez à gcc via stdin.

2

Cela a bien fonctionné pour moi. Juste un code de ligne en cmd.

Tout d'abord, vérifiez que vous avez installé le gcc (C) ou g ++ (C++) compilateur.

cmd pour le type de gcc:

gcc --version

cmd pour g ++ Type:

g ++ --version

Si elle est installée alors procéder .

Maintenant, compiler votre .c ou .cpp utilisant cmd

pour .c Syntaxe:

gcc -o exe_filename yourfilename.c

Exemple:

gcc -o monfichier myfile.c

Ici exe_filename (monfichier dans l'exemple) est le nom de votre fichier .exe que vous voulez produire après la compilation (Note: je n'ai mis aucune extension ici). Et yourfilename.c (myfile.c dans l'exemple) est le votre fichier source qui a l'extension .c.

Maintenant, allez dans le dossier contenant votre fichier. C, ici vous trouverez un fichier avec l'extension .exe. Ouvrez-le. Hourra ..

Pour .cpp syntaxe:

g ++ -o exe_filename yourfilename.cpp

Après le processus est le même que pour .c.

Questions connexes