Linker c et c++ sous dev c++

Fermé
nicolas - 13 févr. 2008 à 13:51
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 25 févr. 2008 à 08:43
Bonjour,
je veux realiser un réseau en c++ sous dev c++.
pour le faire, je veux utiliser la bibliotheque net2, qui derive de SDL_net.
le probleme c'est que ce n'est pas un billiothèque avec des .dll .lib et .h
elle est ecrite en c, a partir de SDL_net.
Je voudrais savoir comment appeler les fonctions de NET2.h dans mon programme en c++!
j'ai voulu passer les .c en .cpp mais il y a de multiple erreurs dues a des conversions de format.
J'ai contacter le créateur de la bibliothèque qui m'a di qu'il suffit de linker c et c++ ...
la bibliothèque compile bien et fonctionne en c deja chez moi
Pouvez vous m'aider car je ne vois pas comment le faire!
merci!

3 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
13 févr. 2008 à 14:21
Ce que tu dit est peux clair...
Pour lier du C et du C++, il faut rajouter un extern "C" devant toute les fonction C appelées en C++.
Cela se fait assez simplement en modifiant les .h en incluant au début :
#ifdef _cplusplus
extern "C"{
#endif
et à la fin
#ifdef _cplusplus
}
#endif
Voila, tiens nous au courant de si ça a fonctionner.
0
Bjr!
par lier, tu veux dire utiliser des fonctions en c dans un projet en c++?
pcq j'avais bien rajouté ces lignes de code mais je ne sais pas a quoi ca sert je n'ai pas encore regardé sur internet.

le truc c'est que j'ai des fonctions .h et .c, je peux les compiler.
je voudrais utiliser les fonctions créés dans un projet c++.
ajouter dans les options du projet des liens vers les .o des fonctions compilées en c devrai suffire mais ca ne marche pas.
biensur, j'appelle les .h des fonctions en .c dans le projet c++ et je pense que le probleme vient de la.
0
mamiemando Messages postés 33574 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 14 mars 2025 7 833
24 févr. 2008 à 20:43
1) Au niveau des includes il faut rajouter le chemin des headers de net2 avec les options -I ou -isystem. Par exemple s'ils sont dans /plop/include :
-I/plop/include

2) A la compilation de ton exécutable (mais pas de tes modules),phase dite de linkage :
Pour indiquer au compilateur ou trouver les binaires des librairies (.a ou .so) rajoute les options -L et -Wl,R. Par exemple s'ils sont dans /plop/lib :
-L/plop/lib -Wl,-R/plop/lib

Ensuite :
- avec une librairie .a : en plus de tes .o il faut passer le(s) .a
- avec une librarie .so : il faut utiliser les options -l. Par exemple pour libplop.so passer
-lplop

Donne-nous le chemin de ton .so/.a et de tes .h pour qu'on te donne la ligne de compilation exacte.

Bonne chance
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
25 févr. 2008 à 08:43
Il n'y a pas de raison que ça ne fonctionne pas. Tu doit faie quelque chose de travers.
déjà un peu de théorie :
Quel est le problème de compatiilité entre C et C++ ?
prenons la déclaration d'une fonction simple : int fct(int,double); en C le nom de la fonction sera compiler en assembleur quelque chose du genre : _fct_ alors qu'en C++ ce sera quelque chose du genre _fct_id
le C++ "enjolive" le nom de la fonction en assembleur afin de permettre la surcharge des fonctions (en C++ il est alors possible de déclarer int fct(int); qui sera une fonction différente).
Alors comment appeler une fonction C au sein d'un programme C++ ?
Pour dire à C++ que la fonction déclarée est écrite en C, et que lors de la compilation le nom ne doit pas être décoré, il faut le préciser explicitement au compilateur avec la commande :
extern "C" {int fct(int,double);}
Comment vérifier que les noms sont bien compatible ?
Lorsque tu as tes .o de toutes tes sources, tu peux regarder les nom des fonctions avec nm
nm plop.o t'affichera tout les symboles (fonctions et variables) définis dans plop.o.
0