[Visual C++] Creation et importation d'une library statique (.lib)

Creation et importation d'une library statique (.lib) [Visual C++] - C++ - Programmation

Marsh Posté le 15-10-2007 à 10:01:03    

Bonjour,
 
J'ai crée un projet (A) sous Visual C++ 6, une library statique. Je compile, j'obtiens le .lib. Dans un autre projet (B), j'y copie le fichier .lib généré par le projet A. Je règle les "settings" du projet B pour ajouter le .lib dans les "link". Lorsque j'appelle une méthode de la lib incluse dans B, j'obtiens l'erreur :
 

TiersdeConfianceAuto.obj : error LNK2001: unresolved external symbol "unsigned long __cdecl TEDETIS_E_enumCertificateInStore(char *,struct CertInfo_str * *,int *)" (?TEDETIS_E_enumCertificateInStore@@YAKPADPAPAUCertInfo_str@@PAH@Z)


 
En clair, il ignore ma library ! Pourquoi ? Doit-on explicitement exporter les fonctions d'une library statique (comme une library dynamique DLL) ?
 
Merci.


Message édité par Giz le 15-10-2007 à 10:01:23

---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 15-10-2007 à 10:01:03   

Reply

Marsh Posté le 15-10-2007 à 10:38:43    

J'ai bien mis le #include en entête, j'ai bien configuré le path des include dans "directories" pour ajouter ceux concernant la library incluse, mais rien a faire. La library du projet A est compilée en mode "Multithreaded", Le projet B est une dll compilée en "Multithreaded DLL". Qu'est qui pourrait encore clocher ?  :(


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 15-10-2007 à 11:00:52    

En fait c'est vraiment un problème de linkage car quand je fais une erreur dans l'appel (prototype de fonction non respecté), il me met bien que l'appel est incorrecte à la compilation. Ce n'est donc pas un problème d'include mais bien au niveau du .lib qui est pourtant bien intégré dans le projet.
Je désespère là ...  :(


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 15-10-2007 à 17:20:46    

c'est pas un souci de name mangling ? les fonctions de ta dll sont déclarées en extern "C" ?

Reply

Marsh Posté le 15-10-2007 à 21:28:59    

Pour la DLL, pas de problème du projet (si je n'inclus pas la lib, elle se génère bien).
Autre chose de surprenant : certaine fonctions de la lib marchent en fait (reconnues) d'autres non. C'est lié à un .h qui "marche" et un autre non en gros...v voir ça.


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 16-10-2007 à 09:47:58    

Décidément ça veut pas linker :/


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 16-10-2007 à 10:21:31    

Faut pas faire un .h que tu fous dans ton projet qui utilise la lib ?
 
J'me rappelle avoir eu des problèmes similaires y a longtemps, j'crois les avoir réglés avec l'utilisation d'un .h, quand j'étais moi même compilateur de la lib, ou soit en bidouillant les options quand on me filait une lib (une option avec un truc sur les "_", je sais c'est vague, désolé).

Reply

Marsh Posté le 16-10-2007 à 13:19:53    

Ben j'ai bien inclus les .h de la lib dans projet pourtant. C'est vraiment un problème comme s'il ne trouvait pas l'implémentation de la fonction dans la lib.


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 16-10-2007 à 15:35:05    

--------------------Configuration: TiersdeConfiance - Win32 Release--------------------
Linking...
mfcs42d.lib(dllmodul.obj) : warning LNK4006: _DllMain@12 already defined in msvcrt.lib(dllmain.obj); second definition ignored
   Creating library Release/TiersdeConfiance.lib and object Release/TiersdeConfiance.exp
TiersdeConfianceAuto.obj : error LNK2001: unresolved external symbol "unsigned long __cdecl TEDETIS_E_openSSLSession(struct CertInfo_str *,char *,struct SSLSessionInfo * *)" (?TEDETIS_E_openSSLSession@@YAKPAUCertInfo_str@@PADPAPAUSSLSessionInfo@@@Z)
TiersdeConfianceAuto.obj : error LNK2001: unresolved external symbol "unsigned long __cdecl TEDETIS_E_enumCertificateInStore(char *,struct CertInfo_str * *,int *)" (?TEDETIS_E_enumCertificateInStore@@YAKPADPAPAUCertInfo_str@@PAH@Z)
TiersdeConfianceAuto.obj : error LNK2001: unresolved external symbol "unsigned long __cdecl TEDETIS_E_closeSSLSession(struct SSLSessionInfo *)" (?TEDETIS_E_closeSSLSession@@YAKPAUSSLSessionInfo@@@Z)
Release/TiersdeConfiance.dll : fatal error LNK1120: 3 unresolved externals
Error executing link.exe.
 
TiersdeConfiance.dll - 4 error(s), 1 warning(s)


 
 :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 16-10-2007 à 16:09:44    

je t'ai dit que c'était un problème de décoration de fonction ! tu dois déclarer les fonctions de ta DLL en extern "C", sinon tes fonctions seront décorées et ne pourront pas être appelées depuis un programme C

Reply

Marsh Posté le 16-10-2007 à 16:09:44   

Reply

Marsh Posté le 16-10-2007 à 17:04:22    

ca marche pas, j'ai encore plus d'erreurs. :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:  :cry:


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 16-10-2007 à 23:07:48    

quand je vois le message suivant :

Citation :


mfcs42d.lib(dllmodul.obj) : warning LNK4006: _DllMain@12 already defined in msvcrt.lib(dllmain.obj); second definition ignored
   Creating library Release/TiersdeConfiance.lib and object Release/TiersdeConfiance.exp


je te pose la question suivante : ta dll est une dll MFC ? si oui (ce dont je suis quasiment certain), alors tu dois dégager le DllMain car cette fonction est déjà définie dans dans msvcrt.lib.
tu dois donc instancier un objet dérivé de CWinApp, dont la méthode InitInstance() sera appelée par le DllMain() de msvcrt

 

edit: http://support.microsoft.com/defau [...] us;q148652


Message édité par Harkonnen le 16-10-2007 à 23:10:45
Reply

Marsh Posté le 17-10-2007 à 09:26:25    

Tout m'a l'air bon pourtant   [:spamafote]  :
 

Code :
  1. // TiersdeConfiance.h : main header file for the TIERSDECONFIANCE DLL
  2. //
  3. #if !defined(AFX_TIERSDECONFIANCE_H__2B8205FC_398C_4B1B_BD99_B53C3330C2EA__INCLUDED_)
  4. #define AFX_TIERSDECONFIANCE_H__2B8205FC_398C_4B1B_BD99_B53C3330C2EA__INCLUDED_
  5. #if _MSC_VER > 1000
  6. #pragma once
  7. #endif // _MSC_VER > 1000
  8. #ifndef __AFXWIN_H__
  9. #error include 'stdafx.h' before including this file for PCH
  10. #endif
  11. #include "resource.h"  // main symbols
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CTiersdeConfianceApp
  14. // See TiersdeConfiance.cpp for the implementation of this class
  15. //
  16. class CTiersdeConfianceApp : public CWinApp
  17. {
  18. public:
  19. CTiersdeConfianceApp();
  20. // Overrides
  21. // ClassWizard generated virtual function overrides
  22. //{{AFX_VIRTUAL(CTiersdeConfianceApp)
  23. public:
  24. virtual BOOL InitInstance();
  25. //}}AFX_VIRTUAL
  26. //{{AFX_MSG(CTiersdeConfianceApp)
  27.  // NOTE - the ClassWizard will add and remove member functions here.
  28.  //    DO NOT EDIT what you see in these blocks of generated code !
  29. //}}AFX_MSG
  30. DECLARE_MESSAGE_MAP()
  31. };
  32. /////////////////////////////////////////////////////////////////////////////
  33. //{{AFX_INSERT_LOCATION}}
  34. // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
  35. #endif // !defined(AFX_TIERSDECONFIANCE_H__2B8205FC_398C_4B1B_BD99_B53C3330C2EA__INCLUDED_)


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 17-10-2007 à 09:28:07    

et la méthode InitInstance :
 

Code :
  1. BOOL CTiersdeConfianceApp::InitInstance()
  2. {
  3. // Register all OLE server (factories) as running.  This enables the
  4. //  OLE libraries to create objects from other applications.
  5. COleObjectFactory::RegisterAll();
  6. return TRUE;
  7. }


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 18-10-2007 à 10:34:30    

En fait j'ai carrément intégré les .c et les .h dans mon projet A. J'ai les mêmes erreurs (problème de linkage)  :ouch: .
J'ai tout essaié : j'ai bien géré mes sources .c comme un programme purement C. Dans le code de mon projet A, je mets dans le .cpp pour intégrer les sources C :
 

Code :
  1. #ifdef __cplusplus
  2. extern "C" {
  3. #endif
  4. #include "TEDETIS_E_SEND_ENVELOP.H"
  5. #include "TEDETIS_E_SSL_SESSION.H"
  6. #ifdef __cplusplus
  7. }
  8. #endif


 
Mais j'ai toujours le porblème de linkage .  :cry:


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Sujets relatifs:

Leave a Replay

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