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 :

Edition de liens et librairie dynamique


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de nicolas.pied
    Profil pro
    Ingénieur d'Etudes
    Inscrit en
    Janvier 2005
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur d'Etudes

    Informations forums :
    Inscription : Janvier 2005
    Messages : 249
    Par défaut Edition de liens et librairie dynamique
    Bonjour,

    J'ai réalisé une librairie dynamique sous Linux (.so) à partir de GCC. Celle-ci contient pour le moment deux fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char * matching(const char *, const char *);
    int match(const char *, const char *);
    Avec le Makefile suivant pour cette librairie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    libkregexp.so.1.0 : kregexp.o
            gcc -fPIC kregexp.o -shared -W1,-soname,libkregexp.so.1 -o libkregexp.so.1.0
     
    kregexp.o : kregexp.h kregexp.c
            gcc -fPIC -c kregexp.c
    Ensuite, j'ai un second programme, écrit en C++. Une de mes classes a besoin d'appeler la fonction matching de la librairie. La compilation du code C++ fonctionne mais l'édition des liens non :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    hd_quota : main.o hd_quota.o
            g++ main.o hd_quota.o -o hd_quota -L. libkregexp.so.1.0
     
    main.o : main.cpp hd_quota.h
            g++ -Wall -c main.cpp
    hd_quota.o : hd_quota.h hd_quota.cpp kregexp.h
            g++ -Wall -c hd_quota.cpp
    Cela me donne l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    g++ main.o hd_quota.o -o hd_quota -L. libkregexp.so.1.0
    main.o(.text+0x1bb): In function `main':
    : undefined reference to `matching(char const*, char const*)'
    collect2: ld a retourné 1 code d'état d'exécution
    make: *** [hd_quota] Erreur 1
    Ma question est donc : comment appeler les fonctions d'une librairie C (compilée avec GCC) à partir d'une classe C++ ?

    Merci bien !
    Un peu d'humour : jokes.guppix.fr
    Articles et actualités informatiques : Kbups.org
    Articles sur le développement informatique : nicolaspied.developpez.com

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Pour lier un source à une biliothèque avec gcc, il faut introduire la bibliothèque avec le flag -l, et omettre l'encapsulation syntaxique de la lib.
    Pour compiler ton main essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ main.o hd_quota.o -o hd_quota -L . -lkregexp

  3. #3
    Membre éclairé
    Avatar de nicolas.pied
    Profil pro
    Ingénieur d'Etudes
    Inscrit en
    Janvier 2005
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur d'Etudes

    Informations forums :
    Inscription : Janvier 2005
    Messages : 249
    Par défaut
    En fait il n'arrive pas à toruver la librairie kregexp lorsque l'on précise l'option de linkage -lkregexp. (Celle-ci se trouve dans /usr/lib/libkregexp.so.1.0)

    Aurais-je mal compiler ma librairie ?

    Pourtant avec un programme écrit en C, les appels aux fonctions de la librairie fonctionne très bien.

    Merci
    Un peu d'humour : jokes.guppix.fr
    Articles et actualités informatiques : Kbups.org
    Articles sur le développement informatique : nicolaspied.developpez.com

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Pour le moment, il ne trouve pas la lib, c'est tout.
    Crée un lien symbolique nommé libkregexp.so qui pointe sur ta lib et ça devrait marcher

  5. #5
    Membre éclairé
    Avatar de nicolas.pied
    Profil pro
    Ingénieur d'Etudes
    Inscrit en
    Janvier 2005
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur d'Etudes

    Informations forums :
    Inscription : Janvier 2005
    Messages : 249
    Par défaut
    Dans mon code C++, j'appel la fonction de la librairie de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s", matching("Bonjour ca va ?", "([a-z]{1,})"));
    J'ai bien mis en place le lien symbolique vers ma librairie avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ln -s /usr/lib/libkregexp.so.1.0 /usr/lib/libkregexp.so
    Ce qui lui permet à GCC/G++ de reconnaître la librairie avec -lkregexp.

    Cependant, lors de la compilation, j'ai toujours la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    > make
    g++ main.o hd_quota.o -o hd_quota -L. -lkregexp
    main.o(.text+0x231): In function `main':
    : undefined reference to `matching(char const*, char const*)'
    collect2: ld a retourné 1 code d'état d'exécution
    make: *** [hd_quota] Erreur 1
    On dirait qu'il recherche la fonction matching dans le code local et non dans le code de la librairie. Mon appel à la fonction matching est-il correct ?

    Merci.
    Un peu d'humour : jokes.guppix.fr
    Articles et actualités informatiques : Kbups.org
    Articles sur le développement informatique : nicolaspied.developpez.com

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Envoie moi le code et la bib. AMA c'est rien
    dxjbmderkns7cif@jetable.net

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Arf, j'ai pas les yeux en face des trous ce matin.
    Ta bibliothèque c'est du C, et compilé comme tel. Ton programme principal c'est du C++.
    Pour pouvoir utiliser du C dans un prog. C++, il faut préciser au compilateur que c'en est.
    Les déclarations de fonction C doivent être faites entre les accolades de :
    Le plus simple c'est de modifier le fichier d'entête de ta bibliothèque pour qu'il soit compatible avec du C et du C++
    Ca devient
    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
    #ifndef __K_REGEXP_H__
    #define __K_REGEXP_H__
    ...
    // LES INCLUDES
    ...
     
    #ifdef __cplusplus
    extern "C" {
    #endif
    ...
    // DECLARATION DES FCT DE LA BIB
    ...
    #ifdef __cplusplus
    }
    #endif
     
    #endif
    La variable "__cplusplus" est positionnée par gcc en fonction de s'il compile du C ou du C++. Bref, c'est la procédure classique. Je me demande d'ailleurs, si elle n'est pas dans la FAQ.

    Quant à la raison profonde, c'est que effectivement pour l'éditeur de lien la fonction match() version C et la fonction match version C++ sont deux entités différentes, d'où l'echec de l'édition.

  8. #8
    Membre éclairé
    Avatar de nicolas.pied
    Profil pro
    Ingénieur d'Etudes
    Inscrit en
    Janvier 2005
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur d'Etudes

    Informations forums :
    Inscription : Janvier 2005
    Messages : 249
    Par défaut
    Bizarre, bizarre...

    Voici donc le code du fichier d'entete de la librairie :

    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
    #ifndef __K_REGEXP_H__
    #define __K_REGEXP_H__
     
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <regex.h>
     
    #define BUFSIZE 1024
     
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    char * matching(const char *, const char *);
    int match(const char *, const char *);
     
    #ifdef __cplusplus
    }
    #endif
     
    #endif
    J'ai testé la compilation de cette librairie de deux façons, toutes les deux fonctionnent très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -fPIC kregexp.o -shared -W1,-soname,libkregexp.so.1 -o libkregexp.so.1.0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -fPIC kregexp.o -shared -W1,-soname,libkregexp.so.1 -o libkregexp.so.1.0
    Lorsque je réalise la compilation du programme qui réalise un appel au fonction de la librairie (que ce soit avec la librairie compilée avec GCC ou G++), il me retourne toujours la même erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    g++ -o test test.o -L. libkregexp.so.1.0 
    test.o(.text+0x20): In function `main':
    : undefined reference to `matching(char const*, char const*)'
    collect2: ld a retourné 1 code d'état d'exécution
    Mon appel aux fonctions de la librairie ou leurs déclarations, sont-ils corrects ?

    Merci.
    Un peu d'humour : jokes.guppix.fr
    Articles et actualités informatiques : Kbups.org
    Articles sur le développement informatique : nicolaspied.developpez.com

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Avec ce que tu m'as fournis, ça compile sans problème.
    Est-ce que tu as recompilé test.o ?
    Le code que tu fournis, c'est uniquement l'édition de lien, il faut recompiler test.c avec le nouvel entête.

  10. #10
    Membre éclairé
    Avatar de nicolas.pied
    Profil pro
    Ingénieur d'Etudes
    Inscrit en
    Janvier 2005
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur d'Etudes

    Informations forums :
    Inscription : Janvier 2005
    Messages : 249
    Par défaut
    La je crois que c'est moi qui n'est pas les yeux en face des trous, lol.

    J'ai recompilé test.o et l'édition des liens fonctionne correctement en c et en c++.

    Merci bien pour ton aide !
    Un peu d'humour : jokes.guppix.fr
    Articles et actualités informatiques : Kbups.org
    Articles sur le développement informatique : nicolaspied.developpez.com

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

Discussions similaires

  1. edition de lien avec librairie statique
    Par vision_opencv dans le forum Linux
    Réponses: 3
    Dernier message: 06/08/2007, 01h09
  2. [Posix] problème librairie posix edition de lien
    Par hortensinette dans le forum Développement OS X
    Réponses: 1
    Dernier message: 12/04/2007, 15h57
  3. Edition de liens dynamique sous linux
    Par Ipoupaille dans le forum Linux
    Réponses: 4
    Dernier message: 09/01/2006, 21h53
  4. création d'une librairie dynamique
    Par bilo2000 dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 26/08/2004, 15h17
  5. Librairies dynamique sous AIX en C++ : MaLib.so
    Par didierM dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 23/10/2003, 18h19

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