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 :

Comment utiliser une librarie .so (sous linux)


Sujet :

Linux

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 25
    Points : 12
    Points
    12
    Par défaut Comment utiliser une librarie .so (sous linux)
    Bonjour,
    J'ai un example d'application C sous windows qui utilise une librarie (DLL).
    Avec cette librairie j'ai également reçu un fichier .so et je voudrais tester cette librarie sous Linux.
    En gros je voudrais faire la même application que celle que j'ai recu pour windows.
    Malheureusement je ne sais pas comment faire pour charger une librairie dans mon code C sous linux.
    Ce-dessous vous pouvez voir quelque lignes de codes extraites de l'application C sous windows:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    //create instance
    public HINSTANCE    myHI;
     
    //definition of callback
    typedef INT (CALLBACK* LPFNDLLflxSetConfiguration)(int func, int comtype, char *comnr, int comport );
     
    //load lib
    myHI = LoadLibrary("flxdrv.dll");
    .
    .
    //register to get callback fron library
    flxSetConfiguration = (LPFNDLLflxSetConfiguration) GetProcAddress(myHI,"_flxSetConfigurationVB@16");
    .
    .
    .
    J'ai essayé d'utiliser ce code sous Linux mais il n'y a pas moyen de compiler.
    Pouvez-vous me dire où commencer/quoi changer?
    Y a t'il des tutorials où je pourrai trouver plus d'infos sur la manière d'utiliser des libraries C sous Linux et spécialement avec des explications sur les callback?

    Merci d'avance pour votre aide.

    Alain.

  2. #2
    Membre Expert

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

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    L'API n'est pas la même sous linux.

    Il faut que tu regardes du côté de dlopen et cie http://man.developpez.com/man3/dlopen.3.php
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  3. #3
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    sous unixoide tu ne la charges pas...

    Elle est dynamique..

    Tu dois (par défaut, bien qu'on puisse faire autrement) la placer dans /usr/lib
    et uniquement include les ".h", et au moment de la compile indiquer par les flags de compilations où elle se trouve.

    Si par défaut elle n'est pas dans /usr/lib, il te faut rajouter :

    ça c'était le principe..

    et comme dit Hegros en plus ça compilera pas c'est pas la même API..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Notre ami hiko-seijuro a fait un tutoriel là-dessus :
    http://hiko-seijuro.developpez.com/a...que-dynamique/

    Certes c'est pour l'exportation de classes C++ (hmmm, c'est quoi le C++ ? ) mais le princpe reste le même pour ce qui est de l'exportation.

    Jc

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par souviron34
    sous unixoide tu ne la charges pas...
    Si, avec dlopen().

    LoadLibrary() <==> dlopen()
    GetProcAddress() <==> dlsym()
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  6. #6
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par David.Schris
    Si, avec dlopen().

    LoadLibrary() <==> dlopen()
    GetProcAddress() <==> dlsym()
    connais pas.....
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par souviron34
    connais pas.....
    Solaris (ou SunOS) et Linux (inspiré de Solaris sur ce point) entre autres. Peut-être pas tous unixoïdes mais
    Citation Envoyé par [url=http://www.die.net/doc/linux/man/man3/dlopen.3.html]man dlopen[/url]
    HISTORY
    The dlopen interface standard comes from SunOS. That system also has dladdr(), but not dlvsym().
    CONFORMING TO
    POSIX.1-2001 describes dlclose(), dlerror(), dlopen(), and dlsym().
    Peut servir, par exemple, pour créer un système de plugins...
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  8. #8
    Membre à l'essai
    Inscrit en
    Octobre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 25
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup pour toutes vos réponses.
    J'ai lu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    LoadLibrary() <==> dlopen()
    GetProcAddress() <==> dlsym()
    Mais je n'arrive toujours pas à utiliser dlsym
    Auriez-vous une idée de comment je dois utiliser la commande dlsym pour faire la même chose que la commande utilisée sous windows(ci dessous)?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    flxSetConfiguration = (LPFNDLLflxSetConfiguration) GetProcAddress(myHI,"_flxSetConfigurationVB@16");
    Je n'arrive pas à trouver la bonne syntaxe

    Merci d'avance.

    Alain.

  9. #9
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par David.Schris
    Solaris (ou SunOS) et Linux (inspiré de Solaris sur ce point) entre autres. Peut-être pas tous unixoïdes mais

    Peut servir, par exemple, pour créer un système de plugins...
    ok...

    Mais la question de départ étant sur les .so, normalement en C sous unixoide la manière standard de procéder me semble celle que j'ai décrite ( à moins que je sois un vieux crouton.... ).

    La seule différence de principe entre une librairie statique et une librairie dynamque est que le code n'est pas recopié dans le binaire, mais juste les adresses des routines appelées (d'où d'ailleurs l'inconvénient majeur qu'il faut que la bibliothèque soit au même endroit dans le système).

    Me trompe-je ?
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  10. #10
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par souviron34
    Mais la question de départ étant sur les .so, normalement en C sous unixoide la manière standard de procéder me semble celle que j'ai décrite
    La methode que tu decris est la methode implicite, c'est a dire qu'on laisse l'editeur de liens ajouter le code necessaire (dlopen et compagnie) tout seul. Avec gcc, c'est la methode par defaut (i.e. les .so sont preferes aux .a, sauf si -static est precise). Mais il est possible de le faire explicitement, comme indique plus haut.

  11. #11
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par philipina
    pas à utiliser dlsym
    Tu peux t'inspirer de cet exemple. Il va chercher explicitement la fonction cos() contenue dans la bibliotheque mathematique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <dlfcn.h>
     
    /*
     * gcc -W -Wall -ansi -pedantic -rdynamic -o so so.c -ldl
     */
     
    int main(void)
    {
      void *handle;
      int ret = EXIT_FAILURE;
     
      handle = dlopen ("/usr/lib/libm.so", RTLD_LAZY);
      if (handle == NULL)
      {
        fprintf(stderr, "%s\n", dlerror());
      }
      else
      {
        double (*cosine)(double);
        char *error;
     
        cosine = dlsym(handle, "cos");
        error = dlerror();
        if(error != NULL)
        {
          fprintf(stderr, "%s\n", error);
        }
        else
        {
          printf("%f\n", cosine(2.0));
          dlclose(handle);
          ret = EXIT_SUCCESS;
        }
      }
     
      return ret;
    }
    Note que le compilateur devrait t'avertir que le C ISO interdit la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cosine = dlsym(handle, "cos");
    qui implique un cast de (void *) vers un pointeur de fonction. Mais je n'ai jamais vraiment regarde comment faire sauter cet avertissement...

  12. #12
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par DaZumba
    qui implique un cast de (void *) vers un pointeur de fonction. Mais je n'ai jamais vraiment regarde comment faire sauter cet avertissement...
    Tu peux faire le cast suivant (qui marche exclusivement dans ce cas) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cosine = (double (*)(double)) dlsym(handle, "cos");
    Je ne répondrai à aucune question technique en privé

  13. #13
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par DaZumba
    Avec gcc, c'est la methode par defaut (i.e. les .so sont preferes aux .a, sauf si -static est precise). .
    De quel défaut parles-tu ?

    C'est la mèthode par défaut si on veut créer des librairies dynamiques, oui peut-être, mais ce n'est pas la méthode par défaut de gcc pour lier... C'est même le contraire..

    Quand tu fabriques un éxecutable et que tu précises juste par exemple -lm ou que tu fais appel à stdlib, il ne charge pas une librairie dynamique, mais statique.....
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  14. #14
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par millie
    Tu peux faire le cast suivant (qui marche exclusivement dans ce cas) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cosine = (double (*)(double)) dlsym(handle, "cos");
    Il n'est encore pas content:
    Citation Envoyé par gcc
    ISO C forbids conversion of object pointer to function pointer type.
    Citation Envoyé par souviron34
    ce n'est pas la méthode par défaut de gcc pour lier...
    Tu as sans doute raison, je n'arrive pas a trouver une reference pour etayer mon affirmation. Cela parait dependre des plateformes et de la version de gcc...

  15. #15
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par souviron34
    Quand tu fabriques un éxecutable et que tu précises juste par exemple -lm ou que tu fais appel à stdlib, il ne charge pas une librairie dynamique, mais statique.....
    Lorsque tu passes l'option -lm à l'éditeur de liens, le code est par défaut lié à une bibliothèque libm.so, qui est donc une bibliothèque partagée, sauf si l'option -static est passée à l'éditeur de liens. Si aucun .so de ce nom n'est disponible, le .a correspondant est chargé. C'est le comportement par défaut sur ma plateforme (debian unstable, gcc 4.1.1 + Ubuntu 6.06, gcc 4.0.3).

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/02/2009, 07h11
  2. comment utiliser une library C avec g++
    Par pichouss dans le forum C++
    Réponses: 4
    Dernier message: 22/05/2008, 18h08
  3. Peut-on utiliser une appllication .Net sous Linux ?
    Par goof_22 dans le forum Framework .NET
    Réponses: 8
    Dernier message: 18/10/2006, 11h08
  4. Comment faire une recherche/remplacement sous Linux
    Par fabszn dans le forum Shell et commandes GNU
    Réponses: 12
    Dernier message: 07/02/2006, 16h38
  5. installer une librarie c++ sous linux
    Par youp_db dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 22/01/2006, 23h31

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