Linker c et c++ sous dev c++

nicolas -  
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   -
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   Statut Contributeur Dernière intervention   1 299
 
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
nocolach
 
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 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
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   Statut Contributeur Dernière intervention   1 299
 
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