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 :

Creation de librairies dynamique... Problème !


Sujet :

Linux

  1. #1
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut Creation de librairies dynamique... Problème !
    Bonjour,

    J'ai suivi un cours assez sympa.
    J'ai fait un test avec un ptit programme, un truc vite fait dont voici les codes:

    entete lib
    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
    #ifndef _TEST_PLUGIN_
    #define _TEST_PLUGIN_
     
     
    /* J'ai mis la definition de la structure ici juste pour ne pas
       avoir d'erreur ou de warning lors de la compilation de ce test. */
    struct _test
    {
       char *p_name;
    };
     
    typedef struct _test test_s;
     
     
    char *function_name (test_s *p_test_);
     
     
    #endif /* _TEST_PLUGIN_ */
    code source lib

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "test_plugin.h"
     
     
    char *function_name (test_s *p_test_)
    {
       return p_test_->p_name;
    }
    Le programme

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    #include <stdio.h>
    #include <stdlib.h>
    #include <dlfcn.h>
     
     
    struct _test
    {
       char *p_name;
    };
     
    typedef struct _test test_s;
     
     
    /* Pointeur vers une fonction d'un plugin. */
    char * (*function_test)(test_s *p_test_);
     
     
    int main (int argc, char **argv)
    {
       void *p_handle = NULL;
       char *error = NULL;
     
     
       if (argc == 1)
       {
          printf ("Il faut specifier un plugin a charger !\n");
          exit (0);
       }
     
     
       /* Allocation de la structure. */
       test_s *p_test = malloc (sizeof (test_s));
       if (p_test == NULL)
       {
          printf ("Allocation de 'p_test' echouee !\n");
          exit (1);
       }
     
       /* Remplissage de la structure. */
       p_test->p_name = "o0° CSoldier °0o";
     
     
       /* Chargement de la librairie. */
       p_handle = dlopen (argv[1], RTLD_LAZY);
       if (p_handle == NULL)
       {
          fprintf (stderr, "%s\n", dlerror ());
          free (p_test);
          exit (1);
       }
     
     
       /* Etablissement d'un symbol vers la fonction du plugin. */
       function_test = dlsym (p_handle, "function_name");
       if ((error = dlerror ()) != NULL)
       {
          fprintf (stderr, "%s\n", dlerror ());
          free (p_test);
          exit (1);
       }
     
     
     
     
       /* Appel de la fonction dans la lib. */
       printf ("Mon nom est: %s\n", (*function_test)(p_test));
     
     
     
     
       /* Terminaison de la liaison. */
       dlclose (p_handle);
     
       /* Liberation de la memoire. */
       free (p_test);
     
     
       return EXIT_SUCCESS;
    }
    A la compilation aucun souci. A l'execution:
    test_plugin.so: cannot open shared object file: No such file or directory
    A titre d'info, tous les fichiers se trouvent dans un meme dossier et je ne vois pas pourquoi il ne trouve pas mon fichier .so !

    Pouvez-vous m'aider ?
    Merci
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  2. #2
    Membre habitué
    Avatar de zdra
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 164
    Points : 187
    Points
    187
    Par défaut
    Les libs sont cherchées dans les dossiers donné par une variable d'environement dont je ne retrouves pas le nom... ça doit être LDPATH je crois. Tu dois donc mettre ta lib dans /usr/local/lib par exemple.
    This message was powered by:
    Ubuntu GNU/Linux

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Heu le but du jeu par la suite c'est de permettre a un programme le chargement de plugins donc se serais mieux qu'ils soient dans le dossier de l'appli !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 289
    Points : 342
    Points
    342
    Par défaut Re: Creation de librairies dynamique... Problème !
    Citation Envoyé par CSoldier
    entete lib
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #ifndef _TEST_PLUGIN_
    #define _TEST_PLUGIN_
    Les indentificateurs commencant par _ sont reserves, utilise plutot H_TEST_PLUGIN.

    Citation Envoyé par CSoldier
    Le programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       if (argc == 1)
       {
          printf ("Il faut specifier un plugin a charger !\n");
          exit (0);
       }
    argc peut aussi etre nul ! (il suffit de l'appeler par execve en donnant le bon nom d'executable, mais avec un tableau argv commencant par NULL).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       /* Allocation de la structure. */
       test_s *p_test = malloc (sizeof (test_s));
       if (p_test == NULL)
       {
          printf ("Allocation de 'p_test' echouee !\n");
          exit (1);
       }
    exit(EXIT_ERROR) ext plus portable (et lisible, je trouve aussi...).

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 289
    Points : 342
    Points
    342
    Par défaut
    Citation Envoyé par CSoldier
    Heu le but du jeu par la suite c'est de permettre a un programme le chargement de plugins donc se serais mieux qu'ils soient dans le dossier de l'appli !
    Dans ce cas, il faut modifier LDPATH pour quùil contienne ton dossier...

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par alveric
    Citation Envoyé par CSoldier
    Heu le but du jeu par la suite c'est de permettre a un programme le chargement de plugins donc se serais mieux qu'ils soient dans le dossier de l'appli !
    Dans ce cas, il faut modifier LDPATH pour quùil contienne ton dossier...
    Ok merci, vais tester ca .... pour tout ce que tu as ecrit plus haut, je sais tout ca, mais s'etait un simple programme de test donc sans trop de fioriture !

    -Ajout- :
    Quand je test: echo $LDPATH en fait j'ai l'impression que ca n'existe pas chez moi !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Membre averti

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 289
    Points : 342
    Points
    342
    Par défaut
    Oups... C'est LD_PATH, en fait.

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    En fait non plus, mais j'ai le dossier /lib dans PATH par contre. J'ai essayé de mettre le fichier .so dans ce dossier et là ca fonctionne mais faudrais que je trouve un moyen de personnaliser cela. Ce serais quand meme mieux que les plugins se trouvent dans un dossier du programme.
    Meme si sous Linux le dispatch des fichiers est assez important, de pouvoir mettre des plugin dans un dossier genre /usr/share/dossier_programme/plugins/ serait nettement mieux
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  9. #9
    Membre averti

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 289
    Points : 342
    Points
    342
    Par défaut
    Mais c'est pas vrai, je boulettise, ces jours-ci... Ca m'apprendra a repondre sans relire les manuels...
    Donc c'est LD_LIBRARY_PATH, et c'est man ld.so qui le dit.

    Il faut donc que ton programme modifie cette variable pour que son dossier /usr/sondossier/lib/ se trouve dedans (ou qu'il demande a l'utilisateur de le faire).

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Nan, meme si je fait un echo il m'affiche rien de rien a part un espace blanc a moins que je peut la remplir et que le système en tienne compte, faut que je test ca !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  11. #11
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Bon bin en remplissant cette variable ca marche impec ! Encore merci pour l'info
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  12. #12
    Membre averti

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 289
    Points : 342
    Points
    342
    Par défaut
    C'est normal, le LD_LIBRARY_PATH peut etre vide... vu que les dossiers de bibliotheques "systemes" sont definis dans /etc/ld.so.conf. Donc tu ajoutes ton dossier dans la variables d'environnement, et ca devrait marcher. Chez moi, il ne contient que des dossiers lies a des programmes que j'ai installes dans des dossiers pas standards.

    [edit: oups, je tape lentement, moi... Bon, bah [resolu], alors ? ]

  13. #13
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Résolu
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/03/2013, 17h17
  2. [Free Pascal] [Linux] Deux problèmes liés aux librairies dynamiques
    Par ChPr dans le forum Lazarus
    Réponses: 2
    Dernier message: 20/09/2011, 23h51
  3. Problème de liaison de librairie dynamique
    Par mithrendil dans le forum C#
    Réponses: 2
    Dernier message: 15/06/2011, 23h12
  4. Réponses: 7
    Dernier message: 04/06/2008, 19h22
  5. Problème de librairies dynamiques
    Par Alain B. dans le forum Oracle
    Réponses: 6
    Dernier message: 07/02/2007, 15h15

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