begin process at 2012 05 30 10:41:51
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Autre

 > 

Utiliser une dll


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Utiliser une dll

lundi 8 décembre 2008 à 18:39:16 | Utiliser une dll

alphaone

Bonjour, j'essaye d'utilisé une dll, et j'ai à la compilation:
[code]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)'[/code]
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?
lundi 8 décembre 2008 à 22:44:58 | Re : Utiliser une dll

rt15

Membre Club Administrateur CodeS-SourceS
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).

Ici il y a de l'allemand... Mais il y a un makefile aussi !
mardi 9 décembre 2008 à 06:50:50 | Re : Utiliser une dll

alphaone

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.
mardi 9 décembre 2008 à 11:32:03 | Re : Utiliser une dll

rt15

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
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 :

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


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.

On va donc utiliser l'option -k :

dlltool -k -d K8055D.def -D K8055D.dll -l K8055D.lib

Puis on va rédiger un petit programme pour tester :


#define Q_OS_WIN32

#include "K8055D.h"

int main()
{
  SetAllAnalog();
}


On le compile :

gcc test.c -o test.exe K8055D.lib

Finalement, on vérifie avec depends que le .exe va trouver SetAllAnalog dans la dll.
mardi 9 décembre 2008 à 17:51:57 | Re : Utiliser une dll

alphaone

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.
mardi 9 décembre 2008 à 17:57:15 | Re : Utiliser une dll

alphaone

J'ai rajouter:
    #ifdef __cplusplus
    extern "C" {
    #endif
et
    #ifdef __cplusplus
    }
    #endif
 il ne bug plus que sur 3 liens avec mon projet seulement.
mardi 9 décembre 2008 à 17:59:01 | Re : Utiliser une dll

alphaone

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);

#ifdef __cplusplus
}
#endif

mardi 9 décembre 2008 à 18:06:23 | Re : Utiliser une dll

alphaone

J'ai corriger il me reste que cette erreur:
debug/K8055D_card.o(.text+0x21ac): In function `ZN11K8055D_card16classReadCounterEl':
Z:/usbCard/K8055D_card.cpp:357: undefined reference to `_imp__ReadCounter@4'
Voila mon .h:
    #ifdef __cplusplus
    extern "C" {
    #endif
    __declspec(dllimport) long __stdcall OpenDevice(long CardAddress);
    __declspec(dllimport) void __stdcall CloseDevice();
    __declspec(dllimport) long __stdcall ReadAnalogChannel(long Channel);
    __declspec(dllimport) void __stdcall ReadAllAnalog(long *Data1, long *Data2);
    __declspec(dllimport) void __stdcall OutputAnalogChannel(long Channel, long Data);
    __declspec(dllimport) void __stdcall OutputAllAnalog(long Data1, long Data2);
    __declspec(dllimport) void __stdcall ClearAnalogChannel(long Channel);
    __declspec(dllimport) void __stdcall ClearAllAnalog();
    __declspec(dllimport) void __stdcall SetAnalogChannel(long Channel);
    __declspec(dllimport) void __stdcall SetAllAnalog();
    __declspec(dllimport) void __stdcall WriteAllDigital(long Data);
    __declspec(dllimport) void __stdcall ClearDigitalChannel(long Channel);
    __declspec(dllimport) void __stdcall ClearAllDigital();
    __declspec(dllimport) void __stdcall SetDigitalChannel(long Channel);
    __declspec(dllimport) void __stdcall SetAllDigital();
    __declspec(dllimport) long __stdcall ReadDigitalChannel(long Channel);
    __declspec(dllimport) long __stdcall ReadAllDigital();
    __declspec(dllimport) long __stdcall ReadCounter(long CounterNr);
    __declspec(dllimport) void __stdcall ResetCounter(long CounterNr);
    __declspec(dllimport) void __stdcall SetCounterDebounceTime(long CounterNr, long DebounceTime);
    #ifdef __cplusplus
    }
    #endif

mardi 9 décembre 2008 à 18:20:17 | Re : Utiliser une dll

rt15

Membre Club Administrateur CodeS-SourceS
Dans le .def que je t'ai donné :
ReadCounter@0

A changer en ReadCounter@4.

Les allemands se sont trompés... Je t'avais dit de vérifier !
mardi 9 décembre 2008 à 18:20:17 | Re : Utiliser une dll

alphaone

Ca m'as l'aire d'être bon.

1 2

Cette discussion est classée dans : text, release, cpp, card, k8055d


Répondre à ce message

Sujets en rapport avec ce message

prob compil devc++ socket [ par stefdem ] Bonjour,Quelqu'un peut-il me dire ce que je dois faire pour compiler un projet sous DevC++ 4.9.8.5 utilisant des sockets ?J'insiste sur le fait que c' Pb Dev C++ [ par Laurent0228 ] Salut.Je debute sur Dev C++quand je compile n'importe qu'elle prog voila les messages erreurs.ain.o(.text+0x169):main.cpp: undefined reference to `Cre Probleme de compilation dev-cpp avec winsock2 [ par Tidam ] Voila ca fait plusieurs sources utilisant winsock2 que j'essaye de compilet et dev-cpp me fait toujours les memes erreurs: g++.exe main.o -o "Projet PROBLEME AVEC UNE BIBLIOTHEQUE GRAPHIQUE [ par tekila_bandita ] Bonjour, je me suis acheté un livre sur le C++ intitulé "La BIBLE C++" de Cay HORSTMANN et timothy BUDD... Dans ce livre, pour l'introduction aux stru c::b et socket [ par sheorogath ] bonjour voulant faire un peu de c++ pour changer je me telecharge un ide : code::blocksvoulant m'initier au socket un peu je reussi a me procurer un c Probleme avec winsock [ par ratala ] Bonjour, J'éssaye de travailler avec les winsocks mais à chaque fois que je compile, j'ai ce message d'erreur :.objs\main.o:main.cpp:(.text+0x649): un SDL et GLUT [ par Samaths ] Bonjour à tous!J'ai un petit problème: Je voudrais utiliser OpenGL et la SDL en même temps. Je sais que c'est possible, j'ai trouvé plein de tutoriaux Problème à la compilation: Utilisation de QD [ par TorTukiTu ] Bonjour,Rentrons directement dans le vif du sujet =) . J'ai besoin d'une grande précision pour certaines opérations. Il me faut une précision allant a Petite question sur if( x || y || z) [ par G0ss3Yn ] Bonjour, J'ai lu je ne sais plus où (ou en tout cas j'ai ça en tête) que le test [code=cpp]if( x || y || z) paf( ) ;[/code] est en fait la même chos Mais comment utiliser wxWidgets avec Code::Blocks et VC++ 7.1 toolkit ??!!! [ par zippro4012 ] Je programme en C++ dans l'éditeur Code::Blocks, et compile avec VC++ 7.1 toolkit.Il est relativement ennuyeux d'utiliser les APIs Windows pour créer


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,562 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales