2009-08-24 6 views
1

J'ai un mélange de fichiers c et C++ compilant sous g ++. Comme expliqué dans: What is the difference between g++ and gcc?Migration de g ++ vers gcc

Les fichiers c sont compilés en tant que C++ avec la ligne de commande g ++. Pas un gros problème mais la migration vers gcc permettra aux fichiers c de se compiler en tant que fichiers c et le fichier C++ de compiler en C++. Que dois-je ajouter à la ligne de commande gcc pour les bibliothèques -I include ou -L, que la ligne de commande g ++ est incluse par défaut?

Répondre

1

Vous ne devrait pas besoin d'ajouter tout. S'il utilise C++, il devrait automatiquement intégrer les bibliothèques C++. Si ce n'est pas le cas, vous aurez besoin de -lstdC++ (et si vous avez toujours des références non définies, -lc pour la libc). N'oubliez pas -lm si vous utilisez des fonctions mathématiques.

+1

Nécessaire d'inclure -lstdC++ pour la commande de l'éditeur de liens. – simon

4

Vous ne devriez pas avoir besoin d'ajouter de bibliothèques ou d'inclusions au-delà de ce que vous avez déjà. Que faire pour les fonctions C appelées à partir du code C++ - vous devez indiquer au compilateur C++ que ce sont des fonctions C pour que le programme soit correctement lié et fonctionne.

La pratique courante est d'ajouter les directives suivantes à tous vos en-têtes de C étant inclus dans les fichiers C++:

#ifdef __cplusplus 
extern "C" { 
#endif 

... C header contents go here ... 

#ifdef __cplusplus 
} 
#endif 

Plus d'infos ici: http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html

+4

Nécessaire d'inclure -lstdC++ pour la commande de l'éditeur de liens. – simon

0

Pourquoi ne pas compiler les objets c avec gcc et la C++ avec g ++ et puis quand vous liez, lien en utilisant le g ++?

+0

Je le pourrais probablement, mais j'avais un makefile existant assez compliqué avec la source d'une tierce partie avec laquelle je ne voulais pas avoir de singe. – simon

1

GCC peut déterminer la langue d'un fichier en fonction de l'extension du fichier. Cependant, GCC ne lie pas automatiquement à l'appui de temps d'exécution pour une langue autre que C. En pratique, cela signifie que vous pouvez compiler les programmes C++ en utilisant gcc au lieu de g++ mais vous aurez besoin d'ajouter la directive -lstdc++:

#include <iostream> 

int main() 
{ 
    std::cout << "Hello world\n"; 
} 

g++ hello.cc

gcc hello.cc -lstdc++

Plus précisément, vous devrez spécifier -lstdc++ si vous vous utilisez la bibliothèque standard, exceptions, opérateur new ou RTTI. Par exemple, essayez de compiler les éléments suivants sans -lstdc++:

int main() 
{ 
    try { 
     throw 1; 
    } 
    catch (int i) 
    { 
     return i; 
    } 
} 

S'il vous plaît noter que les conteneurs STL (y compris std::string s) utiliser l'opérateur new par défaut. Strictement parlant, vous devriez être capable d'utiliser les classeurs (std::min, std::find_first_of, etc.) et quelques autres choses dans la bibliothèque standard sans -lstdc++ mais pour la plupart, vous pouvez aussi bien l'inclure (l'éditeur de liens ignorera les bibliothèques que vous ne lie pas réellement à).

+0

Ce genre de sens.Puisque vous utilisez la bibliothèque standard C++ (std :: cout), vous devez évidemment l'inclure dans la ligne de commande. La vraie question est pourquoi vous utilisez la bibliothèque standard C++ dans le vieux C simple? –

+0

@Greso Dries: C et C++ ont toujours int main. Qu'est-ce que vous essayez de dire dans votre commentaire? –

+0

@Greco, Vous remarquerez que la dernière phrase de la question est "Qu'est-ce que les bibliothèques include -L ou -L dois-je ajouter à la ligne de commande gcc, que la ligne de commande g ++ est incluse par défaut?" ce que j'ai compris pour signifier "si j'ai du code C++ et que je veux le compiler avec GCC, quels commutateurs dois-je passer pour que ça marche?" Donc, oui, les deux extraits de programme sont des extraits C++, et pour les compiler avec GCC, il faudrait ajouter le commutateur de ligne de commande -lstdC++. –