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

GCC Discussion :

[Linux][C][gcc] Tentative de création d'une librairie partagée


Sujet :

GCC

  1. #1
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 319
    Points : 346
    Points
    346
    Par défaut [Linux][C][gcc] Tentative de création d'une librairie partagée
    Salutations,

    Je suis en train d'essayer de faire une librairie partagée qui pourrait être utilisée via 'pkg-config' ou l'option '-l' du compilateur.
    Je n'y arrive pas, même en suivant les tutoriels, et en utilisant des outils comme 'libtool'...

    libtool j'ai laissé tomber, c'est trop neuf pour moi et j'ai pas le temps de lire la documentation et la littérature.
    Par contre, j'ai trouvé pas mal d'exemples qui me semblent valables sur la manière de créer une librairie partagée (shared library)

    Voici comment je procède:

    1. j'ai un fichier source cssm_wide.c que je compile avec ces deux commandes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc -c -fPIC -O cssm_wide.c -o static/staticcssm_wide.o
    gcc -shared -Wall static/staticcssm_wide.o -o shared/libcssm.so.1.0.1
    2. je copie le fichier compilé dans shared dans /usr/lib64

    3. je lance ldconfig

    4. je lance la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ldconfig -p | grep cssm
    et j'obtiens:

    libcssm.so.1.0.1 (libc6,x86-64) => /usr/lib64/libcssm.so.1.0.1

    Je me dis "on est bons..."

    5. Je fais un programme de test qui contient des appels de fonctions qui sont propres à cette librairie, je sens déjà que ça craint car il manque le lien vers le fichier cssm_wide.h qui normalement devrait se trouver dans /usr/include, mais j'essaye quand même.

    Quand je teste le programme avec l'option '-l' l'utilitaire 'ld' me dit "je ne sais pas ce c'est '-llibcssm'... (il ne trouve pas le lien entre libcssm et la librairie qui se trouve dans /usr/lib64).

    Je sais que, normalement, il devrait être possible de spécifier un 'soname' (shared object name) mais je n'y parviens pas... et libtool, malgré les exemples dans la documentation ne me permet pas d'aller aussi loin.

    QUESTIONS:

    1. Comment fait-on pour créer une librairie qui permet par la suite d'utiliser pkg-config ?
    2. Comment fait-on pour créer une librairie qui permet par la suite de passer au compilateur gcc via l'option '-l' le nom de cette librairie ?

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 196
    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 196
    Points : 17 165
    Points
    17 165
    Par défaut
    L'option de commande serait -lcssm.
    D'une manière générale, une bibliothèque est toujours nommée lib<truc>.so.<version>, et où truc est son soname.

    Cela dit, il manque la spécification du soname dans la compilation.
    Sur ma bibliothèque courante (anonymisée en libtruc), ma commande de link est /usr/bin/c++ -fPIC -shared -Wl,-soname,libtruc.so.1.0 -o libtruc.so.1.0.1.
    Suivie par ln -s libtruc.so.1.0.1 libtruc.so.1.0 pour créer le lien symbolique.

    pour pkg-config, a priori, il faut créer un fichier de description. Vois la documentation correspondante.

  3. #3
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 319
    Points : 346
    Points
    346
    Par défaut
    Citation Envoyé par ternel Voir le message
    L'option de commande serait -lcssm.
    D'une manière générale, une bibliothèque est toujours nommée lib<truc>.so.<version>, et où truc est son soname.

    Cela dit, il manque la spécification du soname dans la compilation.
    Sur ma bibliothèque courante (anonymisée en libtruc), ma commande de link est /usr/bin/c++ -fPIC -shared -Wl,-soname,libtruc.so.1.0 -o libtruc.so.1.0.1.
    Suivie par ln -s libtruc.so.1.0.1 libtruc.so.1.0 pour créer le lien symbolique.

    pour pkg-config, a priori, il faut créer un fichier de description. Vois la documentation correspondante.
    Entretemps j'ai fait quelques expériences et j'obtiens des choses pour pkg-config... ce qui n'est pas mal en soi... mais inutile dans mon cas: le programme ne se compile pas ^^

    J'avais vu effectivement la commande avec l'option -soname, mais j'ai été mettre un espace dedans... et je me demandais à chaque fois pourquoi il me disait "file not found" en indiquant un fichier inexistant dans le répertoire où je compilais :{

    Merci... je pense que cela va aller maintenant.
    Je fais la promesse de ne jamais plus faire cette erreur de débutant, à aucun moment, j'ai pensé à coller le '-' de soname à la suite de la virgule renseignée comme un séparateur de commande lié à '-Wl'.

  4. #4
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 319
    Points : 346
    Points
    346
    Par défaut
    Ah ! bin non :{

    Je dois avoir le cerveau qui ne fonctionne pas assez bien...

    Nom : zut1.png
Affichages : 546
Taille : 64,9 Ko

  5. #5
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 319
    Points : 346
    Points
    346
    Par défaut
    Oui bon... encore une fois :{

    Voici la partie de makefile qui ont apporté beaucoup de satisfaction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc -c -fPIC -O cssm_wide.c -o libcssmwide.o
    gcc -shared -Wl,-soname,libcssmwide.so libcssmwide.o -o libcssmwide.so.1.0.1

    Nom : zut2.png
Affichages : 489
Taille : 12,1 Ko

    Pourtant, autant dans la documentation, autant dans les tutoriels je n'ai jamais vu simplement l'extension ".so" pour permettre la compilation d'un code source avec l'extension '-l'.
    Donc, tout va bien, je vais modifier mon fichier '.pc' pour la librairie et j'ai tout bon... cette fois...

    Un GRAND merci pour m'avoir mis sur la voie.

Discussions similaires

  1. [Lazarus] [Linux] Erreur lors de la création d'une instance de classe héritée
    Par timmalos dans le forum Lazarus
    Réponses: 2
    Dernier message: 10/05/2011, 12h59
  2. Création d'une librairie dynamique avec gcc
    Par ba10 dans le forum Autres éditeurs
    Réponses: 0
    Dernier message: 16/12/2009, 19h20
  3. Réponses: 6
    Dernier message: 17/09/2009, 16h13
  4. Réponses: 4
    Dernier message: 16/10/2006, 07h31
  5. création d'une librairie dynamique
    Par bilo2000 dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 26/08/2004, 15h17

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