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

C Discussion :

Création bibliothèque sous Linux


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 256
    Par défaut Création bibliothèque sous Linux
    Bonsoir,

    Je n'arrive pas à créer et utiliser une bibliothèque sous Linux. Voici mon code :
    test.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "my_lib/testlib.h"
     
    int main(void)
    {
        affichage("Hello World");
        return 0;
    }
    mylib/testlib.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #define _GNU_SOURCE
    #include <stdio.h>
    #include <dlfcn.h> 
     
    extern int affichage(const char *message);
    mylib/testlic.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "stdio.h"
     
    int affichage(const char *message)
    {
    	int result=puts("Hello World\n");
    	return result;
    }
    Je compile la bibliothèque comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    cd mylib
    gcc -c -fPIC testlib.c 
    gcc -shared -Wl,-soname,mylib.so.1 testlib.o -o mylib.so.1
    et pour le fichier test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc -c test.c -l<chemin de ma bibliothèque> -o test
    La biliothèque semble ok (si j'utiloise objdump, je vois bien ma fonction affichage)

    Par contre le fichier test compilé est un fichier ELF (file test retourne binen un format ELF), mais il est invalide.
    ldd test me répond "n'est pas un executable dynamique".

    Merci pour votre aide.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 472
    Par défaut
    Bonjour,

    Il faut retirer l'option « -c » quand tu compiles test.c

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 256
    Par défaut
    Merci pour ton retour Obsidian, mais si je ne mets pas -c, j'ai l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    collect2: error: ld returned 1 exit status
    J'ai essayé du coup en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    gcc test.c
    gcc test.o -l/<bibliothèque> -o test
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    pour gcc, l'option -c signifie "s'arreter avant l'édition des liens".
    donc, c'est soit:
    gcc -c test.c
    gcc test.o -lmylib -o test
    soit:
    gcc test.c -lmylib -o test
    -lmylib indique à gcc qu'il doit trouver une bibliothèque mylib (libmylib.so dans ton cas) lors de l'édition des liens.

    a priori, tu dois penser à créer (dans le même dossier que ton exécutable) un lien nommé libmylib.so vers libmylib.so.1

  5. #5
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 256
    Par défaut
    Merci pour vos retours
    Je viens de m'en sortir comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    cd mylib
    gcc -fPIC -c mylib.c
    gcc -shared -o libmylib.so mylib.o
    cd ..
    gcc -o test test.c -lmylib -L/<chemin>
    LD_LIBRARY_PATH=$PWD/mylib
    export LD_LIBRARY_PATH
    Je pense que je vais cafouiller encore un peu notamment avec l'option -lmylib. Je ne vois pas comment se fait le rapport entre mylib et libmylib et du coup, comment ça fonctionne si j'ai un second fichier .c venant dans la bibliothèque, mais ce sera une autre étape.

    L'utilisation de LD_LIBRARY_PATH est pour éviter de copier la bibliothèque dans /lib. L'idéal serait l'utilisation d'un chemin relatif mais j'ai pas l'impression que c'est possible.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    -lbidule cherche libbidule.so ou libbidule.a dans le LD_LIBRARY_PATH et quelques dossiers systèmes (dont /usr/lib)
    le nom bidule est ici totalement indépendant des noms des .c / .o.

    Par ailleurs, tu n'est pas obligé d'exporter la variable shell, cela éviterai de polluer certains scripts.

Discussions similaires

  1. Charger dynamiquement une bibliothèque sous Linux
    Par Dominique49 dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 03/07/2012, 10h28
  2. Créer une bibliothèque sous linux
    Par nightwar dans le forum Linux
    Réponses: 3
    Dernier message: 30/10/2009, 11h39
  3. Linkage de la bibliothèque sous linux
    Par yetimothee dans le forum Allegro
    Réponses: 1
    Dernier message: 09/06/2008, 20h07
  4. Réponses: 4
    Dernier message: 27/08/2007, 02h54
  5. Réponses: 3
    Dernier message: 05/06/2006, 15h45

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