Problème compilation DLL

Signaler
Messages postés
6
Date d'inscription
dimanche 16 mai 2004
Statut
Membre
Dernière intervention
11 juin 2008
-
Messages postés
29
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
16 juin 2008
-
Bonjour;

Je souhaite compiler une DLL (que nous appelerons maDLL) en C avec MinGW qui utilise elle même une autre DLL(que nous appelerons externAPI, j'ai à ma disposition le externAPI.h, le externAPI.lib et le externAPI.dll de cette librairie mais pas les sources, j'inclus donc le externAPI.h dans "maDLL.cpp" , je passe le .lib en paramètre au linker et au moment de compiler j'obtiens un beau : "undefined reference to `_Z15apiFonction@0'".

Dans le .h on peut voir que les fonctions de la DLL sont déclarés en "__stdcall  (j'ai essayé de passer le paramètre -add-stdcall-alias mais même résultat).

Pour faire plus simple voici la commande et le retour:

$ g++ -Wl, externAPI.lib -add-stdcall-alias -shared -o maDLL.dll maDLL.cpp

C:/DOCUME~1/user/LOCALS~1/Temp/ccfqWLD8.o:maDLL.cpp:(.text+0x129): undefined reference to `_Z15apiFonctionv@0'
collect2: ld returned 1 exit status

Je crois que la DLL que j'essaye d'utiliser a été compilée avec VS et qu'il y a donc un problème de compatibilité.
Comment faire, si possible, pour pouvoir utiliser cette DLL avec MinGW?

1 réponse

Messages postés
29
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
16 juin 2008

Salut, ton lib fait le lien entre les déclarations utilisées dans ton code (par le biais du .h) et les exports de ta dll.
la compilation se passe bien code <-> h
Le link ne reconnait pas les entrées entre le lib <-> dll
Peux-tu regénérer le lib (implib) ?
Fait un impdef de ta dll pour voir les prototypes des fonctions exportées par la dll et compare les en dumpant la lib fournie si ce sont les mêmes.

Essaie alors:
handle=loadlibrary("")
typedef  void (*pfpipo) (char *s);  //prototype example (see exact prototype function in your provided header)
pfpipo pipo;
pipo=(pfpipo*)getprocaddress (handle,<name in .def>);
 cout<<endl<<" function "<<(pipo?"":" not ")<<" linked";
if (pipo) pipo ("coucou"); // so we can call it
freelibrary(handle);

bon courage