IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

cygwin et les DLLs


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 39
    Par défaut cygwin et les DLLs
    bonjour !
    je suis en train de bosser sur un tout petit programme qui a pour fonction de faire oscilloscope en utilisant l'entrée usb (avec une petite carte electronique)

    enfin bref, voulant utiliser du libre plutot que l'affreux vcl de borland, j'ai fais l'interface avec glade et je la pilote avec libglademm (c++). le programme fonctionne niquel sous linux et sous windows avec cygwin.

    coté compilation
    mon problème est au niveau de l'interface USB : j'utilise un composant "ftdi".
    une bibliotheque opensource existe sous linux donc fastoche !
    sous windows, il faut que j'utilise une DLL et je n'ai aucune idée comment lier la DLL avec mon prog en passant par g++

    coté programmation
    j'ai compris qu'il faut soit utiliser les "handle" (fichier .lib je crois) pour avoir l'adresse memoire des fonctions
    ou sinon il y a une autre methode avec le "loadlibrary" qui se passe du .lib mais qui est plus compliqué (a la limite, si c'est plus propre..., je n'ai que 4 fonctions a utiliser de toute facon)

    je savais pas trop ou metre mon sujet, ca devrais le faire ici non ?

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Pour utiliser des fonctions d'une DLL dans un projet en général ce qu'on fait c'est qu'on ajoute le .h dans le projet puis dans le code on fait :

    Ensuite on ajoute le .lib au projet et après ça tu peux appeler directement tes fonctions de la dll dans ton code source par exemple :



    Maintenant tout dépend de l'EDI que tu utilises.

    En ligne de commande il faut spécifier le header avec -I et la librairie avec -L

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 39
    Par défaut
    ouais , un prof m'a expliqué, j'ai un fichier .lib pour borland et un autre pour visualc++. mais je ne souhaite pas utiliser ces compilateurs,
    je veux rendre l'application portable.
    sous linux je connais les options de gcc mais je n'ai rien trouvé par rapport aux dll.
    il faudrait compiler de la sorte ?
    g++ -o programme.exe `pkg-config --cflags --libs gtkmm-2.4 libglademm-2.4` -I /c/chemin_du_fichier_entete_de_la_dll.h -L /c/chemin_du_dll.dll main.c

  4. #4
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Une dll ne fonctionne que sous windows sous linux il faut le fichier so

    Tu peux sous linux charger dynamiquement ta library avec les fonctions dlopen ou dlsym. Faire une recherche soous google

    Bilan : si tu n'as qu'un fichier .dll laisse tomber linux ou alors trouve sa correspondance (.so)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 39
    Par défaut
    désolé j'ai pas été tres clair.
    il existe sous linux une bibliotheque opensource pour piloter le peripherique.

    je met le code spécifique à linux entre "#ifdef LINUX_ARCH" et "#endif"
    le code spécifique est entre "#ifdef WINDOWS_ARCH" et "#endif"
    je met au debut de mon main.c "#define WINDOWS_ARCH" pour la version windows
    ou "#define LINUX_ARCH" pour la version linux.

    enssuite , la ligne de compilation c'est un truc du style :

    pour linux
    g++ -o oscillo.bin main.c `pkg-config --cflags --libs gtkmm-2.4 libglademm-2.4 libftdi0`

    pour windows je ne sais trop comment ajouter la bibliotheque dll.
    g++ -o oscillo.bin main.c `pkg-config --cflags --libs gtkmm-2.4 libglademm-2.4` -L monfichier.dll -I monfichier.h
    peu etre ?

    mon appli n'est pas proprement portable comme avec les makefile et les scripts configure (j'ai longtemps essayé de comprendre comment faire mais jamais pigé )
    je veux faire deux versions qui diffèrent que par une petite partie de code et la bibliotheque liée.

    edit je viens de tester et g++ me retourne ca :
    FTD2XX.H:58: error: `PVOID' does not name a type
    FTD2XX.H:59: error: `ULONG' does not name a type
    FTD2XX.H:173: error: typedef `PFT_EVENT_HANDLER' is initialized (use __typeof__
    instead)
    FTD2XX.H:173: error: `DWORD' was not declared in this scope
    FTD2XX.H:173: error: `DWORD' was not declared in this scope
    FTD2XX.H:189: error: `ULONG' does not name a type
    FTD2XX.H:207: error: `FT_STATUS' does not name a type
    FTD2XX.H:213: error: `FT_STATUS' does not name a type
    [...]
    base_func.h:24: error: `BytesReceived' undeclared (first use this function)
    base_func.h:24: error: `FT_Read' undeclared (first use this function)

  6. #6
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    A mon avis c'est pas avec le .dll qu'il faut que tu linkes mais avec ton .lib ou .a

    -LMaLib.lib ou -LMaLib.a

    Pour tes erreurs a priori tes types sont des typedef de windows

    PVOID est un pointeur sur void : void *

    ULONG doit être long non signé : unsigned long

    DWORD un int ?

    A mon avis le mieux est de retrouver le header où sont définis tout ces types peut être windows.h ?

    Tu as ces erreurs sous windows ou linux ou les deux ?

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par klipper
    je met le code spécifique à linux entre "#ifdef LINUX_ARCH" et "#endif"
    le code spécifique est entre "#ifdef WINDOWS_ARCH" et "#endif"
    je met au debut de mon main.c "#define WINDOWS_ARCH" pour la version windows
    ou "#define LINUX_ARCH" pour la version linux.
    :
    c'est bien quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifdef LINUX_ARCH
    ......
    #endif
    #ifdef WINDOWS_ARCH
    .....
    #endif
    ?????
    Si c ça c'est ok mais d'après ce que tu dis j'ai l'impression que c'est pas exactement ça...

    D'autre part, la DLL, c'est la tienne ou pas ?

    En ce qui concerne le link, à mon avis il y a 2 options comme dit plus haut :

    • Soit tu possèdes (ou tu peux générer) la librairie .a ou .so et tu la places dans la ligne en lieu et place de *.dll
    • Soit tu utilises la fonction load comme tu as dit, et il te faut linker avec la .so...


    Enfin c'est pas dans le main que tu dois mettre define WINDOWS ou define Linux, mais dans la ligne de gcc....

    Avec gcc -DWINDOWS_ARCH ou gcc -DLINUX_ARCH


Discussions similaires

  1. Où se rangent les dll windows ?
    Par dabeuliou dans le forum Windows
    Réponses: 9
    Dernier message: 10/08/2005, 09h24
  2. Question sur les dll
    Par cjacquel dans le forum MFC
    Réponses: 2
    Dernier message: 29/04/2005, 17h36
  3. [CR] créer 1 setup contenant tte les dll pr pas installer CR
    Par speed034 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 27/10/2004, 09h57
  4. Question sur les DLL
    Par Hellmout dans le forum MFC
    Réponses: 7
    Dernier message: 22/10/2004, 02h51
  5. [Executable] Intégrer les DLL ou pas?
    Par Superstivix dans le forum C++Builder
    Réponses: 3
    Dernier message: 14/06/2004, 10h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo