alphaone
Messages postés134Date d'inscriptionvendredi 2 mai 2003StatutMembreDernière intervention14 novembre 2009
-
8 déc. 2008 à 18:39
alphaone
Messages postés134Date d'inscriptionvendredi 2 mai 2003StatutMembreDernière intervention14 novembre 2009
-
9 déc. 2008 à 23:05
Bonjour, j'essaye d'utilisé une dll, et j'ai à la compilation:
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-rel
oc -Wl,-s -mthreads -Wl -Wl,-subsystem,windows -o release\usbCard.exe release/ma
in.o release/mainwindow.o release/K8055D_card.o release/moc_mainwindow.o release
/moc_K8055D_card.o release/qrc_resources-interne.o -L"c:\Qt\4.4.3\lib" -lmingw3
2 -lqtmain release\resources-windows_res.o -lk8055d -lQtGui4 -lQtCore4
release/K8055D_card.o(.text+0x264):K8055D_card.cpp: undefined reference to `Read
DigitalChannel(long)'
release/K8055D_card.o(.text+0x297):K8055D_card.cpp: undefined reference to `Read
AllDigital()'
release/K8055D_card.o(.text+0x2c0):K8055D_card.cpp: undefined reference to `Read
AnalogChannel(long)'
release/K8055D_card.o(.text+0x2e6):K8055D_card.cpp: undefined reference to `Read
AnalogChannel(long)'
release/K8055D_card.o(.text+0x459):K8055D_card.cpp: undefined reference to `Open
Device(long)'
release/K8055D_card.o(.text+0xa86):K8055D_card.cpp: undefined reference to `Clos
eDevice()'
release/K8055D_card.o(.text+0xeb2):K8055D_card.cpp: undefined reference to `Read
AnalogChannel(long)'
release/K8055D_card.o(.text+0x10c7):K8055D_card.cpp: undefined reference to `Rea
dAllAnalog(long*, long*)'
release/K8055D_card.o(.text+0x11c2):K8055D_card.cpp: undefined reference to `Out
putAnalogChannel(long, long)'
release/K8055D_card.o(.text+0x13d7):K8055D_card.cpp: undefined reference to `Out
putAllAnalog(long, long)'
release/K8055D_card.o(.text+0x14c2):K8055D_card.cpp: undefined reference to `Cle
arAnalogChannel(long)'
release/K8055D_card.o(.text+0x16ca):K8055D_card.cpp: undefined reference to `Cle
arAllAnalog()'
release/K8055D_card.o(.text+0x17b2):K8055D_card.cpp: undefined reference to `Set
AnalogChannel(long)'
release/K8055D_card.o(.text+0x19da):K8055D_card.cpp: undefined reference to `Set
AllAnalog()'
release/K8055D_card.o(.text+0x1b30):K8055D_card.cpp: undefined reference to `Wri
teAllDigital(long)'
release/K8055D_card.o(.text+0x1c0f):K8055D_card.cpp: undefined reference to `Cle
arDigitalChannel(long)'
release/K8055D_card.o(.text+0x1e1a):K8055D_card.cpp: undefined reference to `Cle
arAllDigital()'
release/K8055D_card.o(.text+0x1eff):K8055D_card.cpp: undefined reference to `Set
DigitalChannel(long)'
release/K8055D_card.o(.text+0x210a):K8055D_card.cpp: undefined reference to `Set
AllDigital()'
release/K8055D_card.o(.text+0x21f2):K8055D_card.cpp: undefined reference to `Rea
dDigitalChannel(long)'
release/K8055D_card.o(.text+0x23fa):K8055D_card.cpp: undefined reference to `Rea
dAllDigital()'
release/K8055D_card.o(.text+0x2550):K8055D_card.cpp: undefined reference to `Rea
dCounter(long)'
release/K8055D_card.o(.text+0x26a0):K8055D_card.cpp: undefined reference to `Res
etCounter(long)'
release/K8055D_card.o(.text+0x27f7):K8055D_card.cpp: undefined reference to `Set
CounterDebounceTime(long, long)'
Ce sont que des fonctions exporter par la dll, j'ai fait le .a personnellement, il marché chez moi.
J'ai bien lier la lib par l'option -lk8055d
J'ai vraiment besoin d'aide.
Voila mon projet:
[url]http://privatepaste.com/download/a70Va2HvKE/url Le probléme viens du .h ou du .a?
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 9 déc. 2008 à 11:32
Essayons de refaire le .lib.
D'un côté, on a la dll.
Elle exporte des symboles. Avec depends, on peut examiner ces symboles.
Ils n'ont rien de particulier (Ce qui est particulier en soit !).
Ensuite, il faut connaître la convention d'appel utilisée lors de la compilation de la dll.
On peut la retrouver en désassemblant la dll... Mais on va plutôt regarder le .h.
Au passage, on remarque qu'il faut définir Q_OS_WIN32 avant d'inclure le .h pour l'utiliser correctement.
On remarque aussi le type bool, que mon compilo C ne connaît pas. Je le remplace par un int.
Soit dit en passant, ce type bool, c'est un peu du n'importe quoi : on sait pas vraiment sa taille qui peut varier d'un compilo à l'autre.
La convention d'appel est __stdcall.
Bien. A présent, il va falloire faire le .lib, qui va faire la traduction entre les symboles recherchés par le linker, et ceux de la dll.
Pour construire le .lib, on va utiliser dlltool, car c'est l'outil fourni avec gcc.
On va avoir besoin de rédiger un .def avec les symboles recherchés par le linker.
Comme la convention d'appel est stdcall, le linker de gcc va cherché des symboles du type Function@n.
Argh, notre dll exporte simplement des symboles de type Function...
Mais ce n'est pas notre problème pour l'instant. On rédige le .def en ne considérant que ce que recherche le lieur.
Le n de Function@n correspond à la taille des arguments de la fonction en octets.
Par exemple, OpenDevice prend un long en argument. Un long fait 4 octets (En compilation 32 bits...) donc le symbole dans le .def doit être OpenDevice@4.
Les allemands on fait un .def. Par mesure de sûreté, il est préférable de le vérifier, et de ne pas mettre les @1, @2, @3 (Ces valeurs améliorent les performances au chargement de la dll, mais sont plus risquèes à utiliser).
On fait donc notre .def :
<hr size="2" width="100%" />LIBRARY K8055D
EXPORTS
ClearAllAnalog@0
ClearAllDigital@0
ClearAnalogChannel@4
ClearDigitalChannel@4
CloseDevice@0
OpenDevice@4
OutputAllAnalog@8
OutputAnalogChannel@8
ReadAll@0
ReadAllAnalog@8
ReadAllDigital@0
ReadAnalogChannel@4
ReadCounter@0
ReadDigitalChannel@4
ResetCounter@4
SetAllAnalog@0
SetAllDigital@0
SetAnalogChannel@4
SetCounterDebounceTime@8
SetDigitalChannel@4
WriteAllDigital@4
<hr size="2" width="100%" />
A présent, le .lib.
Il va falloire dire à dlltool que les symboles sont différents entre le .def et la dll. Pour cela on dispose de ses options :
-U : Elle permet d'ajouter un underscore devant les symboles générés.
-k : Elle permet d'enlever les @n derrière les symboles générés.
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 9 déc. 2008 à 22:08
Perso quand j'ai compilé, je n'ai pas utilisé -l et -L, j'ai utilisé le .lib comme s'il s'agissait un .o.
Pour utiliser ce .lib comme un .a, avec -l, il faut... que ce soit un .a ! Donc faut le renommer en "libk8055d.a". Cf la description des options -l et -L du man de ld.
Après on peut compiler comme ça :
gcc test.c -o test.exe -L. -lK8055D
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 8 déc. 2008 à 22:44
Salut,
C'est un problème au link, donc pas un problème de .h. Apparemment, tu as le choix entre un link avec une lib statique (Le .a), et un link avec la dll (En exploitant le .lib).
alphaone
Messages postés134Date d'inscriptionvendredi 2 mai 2003StatutMembreDernière intervention14 novembre 2009 9 déc. 2008 à 06:50
Je comprend rien à l'allemand, mais je compile avec gcc + mingw, donc j'ai du faire moi même le .a, et tout les outils mes dises que le .lib n'est pas dans un format valide, comment régénérer les 2? J'ai essayé plein de commande qui ont régénérer ces fichiers, mais ça bloque toujours au linker.
alphaone
Messages postés134Date d'inscriptionvendredi 2 mai 2003StatutMembreDernière intervention14 novembre 2009 9 déc. 2008 à 17:51
On peut la retrouver en désassemblant la dll... Mais on va plutôt regarder le .h.:
J'ai du refaire le .h car il ne marcher que avec borland. La il marceh aussi avec gcc.
Au passage c'est moi qui est rajouté Q_OS_WIN32 qui est défini par Qt si on est sur une plateforme windows (comme ça je peu dev aussi sous linux).
Le programme linker marche. Mais j'ai toujours des problèmes avec mon programme en c++.
Voila la ligne excuté au linker:
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\usbCard.exe debug/main.o debug/mainwindow.o debug/K8055D_card.o debug/moc_mainwindow.o debug/moc_K8055D_card.o debug/qrc_resources-interne.o -L"c:\Qt\4.4.3\lib" -lmingw32 -lqtmaind debug\resources-windows_res.o -lk8055d -lQtGuid4 -lQtCored4
Les problémes sont lier au c++ car si j'utilise test.cpp au lieu de .c ça me fait des erreurs partout. Les memes erreur que plus haut.
alphaone
Messages postés134Date d'inscriptionvendredi 2 mai 2003StatutMembreDernière intervention14 novembre 2009 9 déc. 2008 à 17:59
Voila le .h officiel, qui marche pas sous gcc:
#ifdef __cplusplus
extern "C" {
#endif
#define FUNCTION __declspec(dllimport)
FUNCTION long __stdcall OpenDevice(long CardAddress);
FUNCTION __stdcall CloseDevice();
FUNCTION long __stdcall ReadAnalogChannel(long Channel);
FUNCTION __stdcall ReadAllAnalog(long *Data1, long *Data2);
FUNCTION __stdcall OutputAnalogChannel(long Channel, long Data);
FUNCTION __stdcall OutputAllAnalog(long Data1, long Data2);
FUNCTION __stdcall ClearAnalogChannel(long Channel);
FUNCTION __stdcall ClearAllAnalog();
FUNCTION __stdcall SetAnalogChannel(long Channel);
FUNCTION __stdcall SetAllAnalog();
FUNCTION __stdcall WriteAllDigital(long Data);
FUNCTION __stdcall ClearDigitalChannel(long Channel);
FUNCTION __stdcall ClearAllDigital();
FUNCTION __stdcall SetDigitalChannel(long Channel);
FUNCTION __stdcall SetAllDigital();
FUNCTION bool __stdcall ReadDigitalChannel(long Channel);
FUNCTION long __stdcall ReadAllDigital();
FUNCTION long __stdcall ReadCounter(long CounterNr);
FUNCTION __stdcall ResetCounter(long CounterNr);
FUNCTION __stdcall SetCounterDebounceTime(long CounterNr, long DebounceTime);
alphaone
Messages postés134Date d'inscriptionvendredi 2 mai 2003StatutMembreDernière intervention14 novembre 2009 9 déc. 2008 à 18:50
Quand je met le .lib dans le dossier de mingw tout marche, par contre quand je dit au linker que la dll est dans le dossier courant par -L. il me géte pourquoi?