Problème compilation DLL

boponfire Messages postés 6 Date d'inscription dimanche 16 mai 2004 Statut Membre Dernière intervention 11 juin 2008 - 11 juin 2008 à 16:15
pipocodesrc Messages postés 29 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 16 juin 2008 - 12 juin 2008 à 13:57
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

pipocodesrc Messages postés 29 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 16 juin 2008
12 juin 2008 à 13:57
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
0
Rejoignez-nous