How to link my own lib

How to link my own lib - C - Programmation

Marsh Posté le 24-05-2005 à 17:29:13    

Salut tout le monde,
J'ai développé une petite librairie et j'ai voulu l'intégrer dans mon projet (sous vc ++), j'ai bien fait attention d'ajouter le nom de la librairie dans l 'onglet link de mes settings et d'ajouter son path, mais j 'ai reçu le fameux messsage "error LNK2001: unresolved external symbol" ce qui veut dire d'après ce que je sais que la déclaration de la fonction  existe mais pas sa définition (qui est dans la lib).
En fait il s agit d'un appel à une fonction défine dans un fichier appartenant à la LIB.
J'ai du oublier un truc  :heink:  
Si vous pouvez m aider , merci d avance

Reply

Marsh Posté le 24-05-2005 à 17:29:13   

Reply

Marsh Posté le 24-05-2005 à 17:34:58    

bin la fonction est soit pas dans ta lib, soit tu l'as pas bien inseré, soit tu bricoles avec un melange C/C++


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 24-05-2005 à 17:37:15    

Ah oui, ma lib est en C,mais je ne savais pas que ça posait problème:(  
Est ce que je dois la recoder?? il doit bien avoir une solution

Reply

Marsh Posté le 24-05-2005 à 17:38:26    

dans les .h de tes fonctions de la lib :
 
extern "C" {
 
//declaration de tes fonctions
}


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 24-05-2005 à 17:50:41    

Il me retourne une erreur syntaxique!!
Tes sur qu il faut mettre ça la bas, je crois que j ai vu un code dans lequel c'est mis dans le fichier .cpp.
En fait j'ai comme tu m as dit dans ma LIb:
 extern "C" {  
func1(double x);
}
 
et il me retourne "error C2059: syntax error : 'string'".
En fait avant c'était :
"extern func1(double x);"

Reply

Marsh Posté le 24-05-2005 à 18:13:22    

c'est quoi ce titre pourri en anglais ? tu nous prends pour des cake :o

Reply

Marsh Posté le 24-05-2005 à 19:03:33    

Généralement on fait :

#ifdef __cplusplus
extern "C" {
#endif
 
// les prototypes de fonctions ici
 
#ifdef __cplusplus
}
#endif


Afin que ça marche aussi bien en C qu'en C++
 
Bon, après t'es sûr que ta lib est en C (dans le doute recompile avec cette modification) ?
En tout cas, ton programme semble être en C s'il provoque une erreur ici.


Message édité par Tarabiscote le 24-05-2005 à 19:06:35
Reply

Marsh Posté le 25-05-2005 à 00:48:32    

Je ne connais rien a windows donc je dis peut-etre une connerie, mais quand tu cree ta lib il faut exporter les symboles que tu veux rendre accessibles de l'exterieur. Declarer la fonction non "static", ca ne suffit pas. En tout cas ca marche comme ca avec XCOFF.

Reply

Marsh Posté le 25-05-2005 à 08:13:23    

Mais si je fais un "ifdef _cplusplus " ça ne m a servir a rien puisque la déclaration de la fonction est dans une bibliothèque en C. Donc il va pas y entrer.

Reply

Marsh Posté le 25-05-2005 à 08:20:04    

matafan a écrit :

Je ne connais rien a windows donc je dis peut-etre une connerie, mais quand tu cree ta lib il faut exporter les symboles que tu veux rendre accessibles de l'exterieur. Declarer la fonction non "static", ca ne suffit pas. En tout cas ca marche comme ca avec XCOFF.


Tu parles probablement d'une bibliothèque partagée (lien dynamique). Pour les bibliothèques statiques, il suffit que la fonction ne soit pas 'static' (external linkage)
 
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 25-05-2005 à 08:20:04   

Reply

Marsh Posté le 25-05-2005 à 08:30:39    

zied3 a écrit :

Mais si je fais un "ifdef _cplusplus " ça ne m a servir a rien puisque la déclaration de la fonction est dans une bibliothèque en C. Donc il va pas y entrer.


La manip avec le ifdef __cplusplus permet d'utiliser une bibliothèque écrite en C avec un programme écrit en C++. En effet, dans un source compilé en C++, le fichier d'en-tête de la bibliothèque C va être inclus dans le source C++ et être compilé comme du C++. (à ce propos, dans les entêtes supportant C ou C++, il ne faut pas utiliser les mots C++ tels que this, new, delete, class etc.).
 
La macro interne __cplusplus est donc définie, et les déclarations se trouvent donc encadrées de  


extern "C"
{
   /* declarations 'C' */
}


Le but étant d'empécher le compilateur C++ de "décorer" les noms de fonctions (genre myfonc_@@01() au lieu de myfonc() ) de façon à ce que le linker (qui ne connait que 'myfonc') ne soit pas perdu.
 
Si on compile en C, l'effet de extern "C" est nul (non compilé). De toutes façons, extern "C" n'est pas une syntaxe C. Elle génèrerait donc une erreur à la compilation.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 25-05-2005 à 08:37:46    

En fait je viens de me rendre compte d 'un truc , c'est que lorsque je compile mon projet il me geneère un .exp et . lib, et ce même lorsqu il me génère un .exe !!!
Il me genère des warning avec des "use no defaults lib".
Quelqu un a une idée?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed