La liaison C++ à C de GCC
J'ai une fonction extern "C" int ping(void)
en C++ statique-bibliothèque" du projet. Maintenant, je voudrais écrire un simple Hello World C
programme qui va appeler cette fonction int x = ping();
.
- Je utiliser g++ /gcc
mais je ne peut pas lier le C
exécutable avec C++
bibliothèque partagée. S'il vous plaît, comment peut-on le faire? Pourriez-vous fournir exacte gcc
commandes?
Modifier:
g++ -c -static liba.cpp
ar rcs liba.a liba.o
gcc -o x main.o -L. -la
et obtenez:
./liba.a(liba.o):(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld a retourné 1 code de sortie
-l<library>
ne fonctionne pas?Quel est le nom de la bibliothèque statique fichier? est-il de la forme "lib<nom>.un"? si c'est vous devriez être en mesure d'utiliser les drapeaux de compilation "-L<chemin d'accès à la bibliothèque> -l<nom>"
J'obtiens: ./liba.un(liba.o):(.eh_frame+0x12): undefined reference to `__gxx_la personnalité_v0' collect2: ld a retourné 1 code de sortie
OriginalL'auteur Cartesius00 | 2011-09-02
Vous devez vous connecter pour publier un commentaire.
Vous pourriez avoir à utiliser g++ comme éditeur de liens, pas de gcc. Si le
ping()
fonction utilise la STL, ou des exceptions, nouvelles, etc, il est probablement liens contrelibstdc++
, qui est lié automatiquement lorsque vous utiliser g++ comme éditeur de liens.Compte tenu de l'erreur que vous avez collé ci-dessus, vous avez besoin de lien à l'aide de g++. Vous pouvez compiler des fichiers avec gcc, mais g++ doit être utilisé comme éditeur de liens (ou ajouter explicitement -lstdc++ pour votre LDFLAGS/gestionnaire de ligne de commande).
Une question: Si j'ai besoin d'appeler une DLL (compilé avec g++) à partir de C (compilé avec gcc) est-il alors possible? (au lieu de la liaison statique)
Oui, tant et aussi longtemps que vous avez une poignée name mangling vous-même, ou b) la marque de symboles comme
extern "C"
.Oui, extern "C" est la manière. Parfait, merci beaucoup.
OriginalL'auteur chmeee
Rechercher le nom d'amputation. Si la bibliothèque C++ n'est pas à l'exportation "extern C" noms, il devient intéressant dans l'une des trois façons différentes, en fonction du compilateur a été utilisé pour la construction de la bibliothèque.
Même alors, vous n'obtiendrez pas de résultats satisfaisants, comme beaucoup de C++ concepts ne sera pas traitée correctement par un programme qui démarre sur les C côté de la barrière. Vous ne pensez pas qu'un programme C va réellement faire le tout de l'indirectement appelé C++ blocs statiques lorsqu'il ne comprend pas les garanties d'une "langue étrangère, avez-vous?
La version courte de l'histoire. Même si vous êtes à la programmation en C, si vous voulez gérer correctement une bibliothèque C++, vous avez besoin de votre principal compilé en C++.
OriginalL'auteur Edwin Buck
J'ai de bons résultats dans la compilation et la liaison mixte de code C/C++ avec GCC, mais vous avez tous deux besoin de la "extern C" (explicitement déclarer les fonctions que les fonctions C) et les relier à l'encontre des bibliothèques C++ avec -lstdc++.
Voir aussi:
En C++, ce qui est l'effet de la extern "C"?
Quelle est la différence entre g++ et gcc?
OriginalL'auteur Ingemar Ragnemalm