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 :

Conversion d'une librairie C en C++


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Conversion d'une librairie C en C++
    Bonjour à tous,

    Je développe actuellement une librairie en C sous Linux. Cependant souhaitant qu'elle utilise une autre librairie en C++, je me suis dis que la solution la plus simple était de la convertir. Dans ce sens là, ça devrait normalement ne pas trop poser de problème.

    Utilisant Autoconf, la solution la plus rapide est de renommer mes fichiers .c en .cc, modifier mes Makefile.am et remplacer mes CFLAGS en CXXFLAGS. Bref, je refais marcher la moulinette, ma librairie se compile en intégralité mais quand j'essaie de compiler le programme test qui l'accompagne, c'est la catastrophe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    libtool: link: g++ -g -O2 -march=native -O0 -g3 -ggdb3 -pipe -ftracer -fsched2-use-traces -Wl,-O0 -fno-inline -Wall -Wextra -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -Wno-comment -Wswitch-enum -Wswitch-default -Wshadow -Werror -DLOCALEDIR=\"/usr/local/share/locale\" -DDATADIR=\"/usr/local/share/2lgc\" -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -g -O2 -o .libs/codegui codegui-main.o -pthread  -L/usr/lib64 ../../lib/.libs/liblibrairie.so -llist -lxml2 -lgtk-3 -lgdk-3 /usr/lib64/libatk-1.0.so /usr/lib64/libgio-2.0.so -lresolv -lz -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lcairo -lpango-1.0 -lfreetype -lfontconfig /usr/lib64/libgobject-2.0.so /usr/lib64/libgmodule-2.0.so -ldl /usr/lib64/libgthread-2.0.so -lpthread /usr/lib64/libglib-2.0.so -lrt /usr/lib64/libumfpack.so /usr/lib64/libcholmod.so /usr/lib64/libmetis.so -lreflapack /usr/lib64/libcolamd.so /usr/lib64/libcamd.so /usr/lib64/libccolamd.so -lblas /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/libgfortran.so /usr/lib64/libamd.so -lm -pthread
    ../../lib/.libs/liblibrairie.so: undefined reference to `liblist_list_front(list*)'
    ../../lib/.libs/liblibrairie.so: undefined reference to `liblist_list_rear(list*)'
    ../../lib/.libs/liblibrairie.so: undefined reference to `liblist_list_free_free(void*)'
    Pour info, liblist_list_front est dans la librairie liblist.

    Voici ci-dessous le résultat de mes recherches (comparaison entre la librairie compilée via gcc et via g++) :
    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
     
    ldd gcc/lib/.libs/liblibrairie.so |grep list
            liblist.so.3 => /usr/lib64/liblist.so.3 (0x00007f844cc91000)
    ldd g++/lib/.libs/liblibrairie.so |grep list
            liblist.so.3 => /usr/lib64/liblist.so.3 (0x00007f6777c96000)
     
    nm gcc/lib/.libs/liblibrairie.so |grep list
                     U g_list_foreach
                     U g_list_free
                     U g_list_last
                     U liblist_list_curr
                     U liblist_list_empty
                     U liblist_list_free
                     U liblist_list_free_free
                     U liblist_list_front
                     U liblist_list_init
                     U liblist_list_insert_after
                     U liblist_list_insert_before
                     U liblist_list_mvfront
                     U liblist_list_mvnext
                     U liblist_list_mvprev
                     U liblist_list_mvrear
                     U liblist_list_rear
                     U liblist_list_remove_curr
                     U liblist_list_remove_front
                     U liblist_list_size
     
    nm g++/lib/.libs/liblibrairie.so |grep list
                     U _Z17liblist_list_currP4list
                     U _Z17liblist_list_freeP4listPFvPvE
                     U _Z17liblist_list_initv
                     U _Z17liblist_list_rearP4list
                     U _Z17liblist_list_sizeP4list
                     U _Z18liblist_list_emptyP4list
                     U _Z18liblist_list_frontP4list
                     U _Z19liblist_list_mvnextP4list
                     U _Z19liblist_list_mvprevP4list
                     U _Z19liblist_list_mvrearP4list
                     U _Z20liblist_list_mvfrontP4list
                     U _Z22liblist_list_free_freePv
                     U _Z24liblist_list_remove_currP4list
                     U _Z25liblist_list_insert_afterP4listPvm
                     U _Z25liblist_list_remove_frontP4list
                     U _Z26liblist_list_insert_beforeP4listPvm
                     U g_list_foreach
                     U g_list_free
                     U g_list_last
    Ce que je constate c'est que les symboles semblent être renommés lorsque la librairie est compilée sous g++. Et mon dernier constat, la commande ldd -u -r liblibrairie.so donne :
    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
     
    ldd -u -r gcc/lib/.libs/liblibrairie.so
    Unused direct dependencies:
            /lib64/libpthread.so.0
     
    ldd -u -r g++/lib/.libs/liblibrairie.so
          1059:     g++/lib/.libs/liblibrairie.so: error: symbol lookup error: undefined symbol: _Z22liblist_list_free_freePv (continued)
    undefined symbol: _Z22liblist_list_free_freePv  (g++/lib/.libs/liblibrairie.so)
          1059:     g++/lib/.libs/liblibrairie.so: error: symbol lookup error: undefined symbol: _Z18liblist_list_frontP4list (continued)
    undefined symbol: _Z18liblist_list_frontP4list  (g++/lib/.libs/liblibrairie.so)
          1059:     g++/lib/.libs/liblibrairie.so: error: symbol lookup error: undefined symbol: _Z17liblist_list_rearP4list (continued)
    undefined symbol: _Z17liblist_list_rearP4list   (g++/lib/.libs/liblibrairie.so)
          1059:     g++/lib/.libs/liblibrairie.so: error: symbol lookup error: undefined symbol: _Z17liblist_list_freeP4listPFvPvE (continued)
    undefined symbol: _Z17liblist_list_freeP4listPFvPvE     (g++/lib/.libs/liblibrairie.so)
          1059:     g++/lib/.libs/liblibrairie.so: error: symbol lookup error: undefined symbol: _Z19liblist_list_mvrearP4list (continued)
    undefined symbol: _Z19liblist_list_mvrearP4list (g++/lib/.libs/liblibrairie.so)
          1059:     g++/lib/.libs/liblibrairie.so: error: symbol lookup error: undefined symbol: _Z24liblist_list_remove_currP4list (continued)
    undefined symbol: _Z24liblist_list_remove_currP4list    (g++/lib/.libs/liblibrairie.so)
          1059:     g++/lib/.libs/liblibrairie.so: error: symbol lookup error: undefined symbol: _Z17liblist_list_sizeP4list (continued)
    undefined symbol: _Z17liblist_list_sizeP4list   (g++/lib/.libs/liblibrairie.so)
          1059:     g++/lib/.libs/liblibrairie.so: error: symbol lookup error: undefined symbol: _Z17liblist_list_currP4list (continued)
    undefined symbol: _Z17liblist_list_currP4list   (g++/lib/.libs/liblibrairie.so)
          1059:     g++/lib/.libs/liblibrairie.so: error: symbol lookup error: undefined symbol: _Z26liblist_list_insert_beforeP4listPvm (continued)
    undefined symbol: _Z26liblist_list_insert_beforeP4listPvm       (g++/lib/.libs/liblibrairie.so)
          1059:     g++/lib/.libs/liblibrairie.so: error: symbol lookup error: undefined symbol: _Z17liblist_list_initv (continued)
    undefined symbol: _Z17liblist_list_initv        (g++/lib/.libs/liblibrairie.so)
          1059:     g++/lib/.libs/liblibrairie.so: error: symbol lookup error: undefined symbol: _Z19liblist_list_mvprevP4list (continued)
    undefined symbol: _Z19liblist_list_mvprevP4list (g++/lib/.libs/liblibrairie.so)
          1059:     g++/lib/.libs/liblibrairie.so: error: symbol lookup error: undefined symbol: _Z25liblist_list_remove_frontP4list (continued)
    undefined symbol: _Z25liblist_list_remove_frontP4list   (g++/lib/.libs/liblibrairie.so)
          1059:     g++/lib/.libs/liblibrairie.so: error: symbol lookup error: undefined symbol: _Z19liblist_list_mvnextP4list (continued)
    undefined symbol: _Z19liblist_list_mvnextP4list (g++/lib/.libs/liblibrairie.so)
          1059:     g++/lib/.libs/liblibrairie.so: error: symbol lookup error: undefined symbol: _Z25liblist_list_insert_afterP4listPvm (continued)
    undefined symbol: _Z25liblist_list_insert_afterP4listPvm        (g++/lib/.libs/liblibrairie.so)
          1059:     g++/lib/.libs/liblibrairie.so: error: symbol lookup error: undefined symbol: _Z20liblist_list_mvfrontP4list (continued)
    undefined symbol: _Z20liblist_list_mvfrontP4list        (g++/lib/.libs/liblibrairie.so)
          1059:     g++/lib/.libs/liblibrairie.so: error: symbol lookup error: undefined symbol: _Z18liblist_list_emptyP4list (continued)
    undefined symbol: _Z18liblist_list_emptyP4list  (g++/lib/.libs/liblibrairie.so)
    Unused direct dependencies:
            /usr/lib64/liblist.so.3
            /usr/lib64/libatk-1.0.so.0
            /usr/lib64/libgio-2.0.so.0
            /lib64/libresolv.so.2
            /lib64/libz.so.1
            /usr/lib64/libpangoft2-1.0.so.0
            /usr/lib64/libpangocairo-1.0.so.0
            /usr/lib64/libgdk_pixbuf-2.0.so.0
            /usr/lib64/libcairo-gobject.so.2
            /usr/lib64/libcairo.so.2
            /usr/lib64/libpango-1.0.so.0
            /usr/lib64/libfreetype.so.6
            /usr/lib64/libfontconfig.so.1
            /usr/lib64/libgmodule-2.0.so.0
            /lib64/libdl.so.2
            /usr/lib64/libgthread-2.0.so.0
            /lib64/libpthread.so.0
            /lib64/librt.so.1
            /usr/lib64/libmetis.so.4
            /usr/lib64/libreflapack.so
            /usr/lib64/libcolamd.so.0
            /usr/lib64/libcamd.so.0
            /usr/lib64/libccolamd.so.0
            /usr/lib64/libblas.so
            /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/libgfortran.so.3
            /usr/lib64/libamd.so.0
            /usr/lib64/libstdc++.so.6
    En conclusion, même si la compilation de la librairie semble avoir marché sans problème, je constate qu'il y a de grosses différences "sous le capot" de la nouvelle librairie. Est-ce que quelqu'un voit ce qu'il se passe ?!? N'hésitez pas à me demander d'autres informations si besoin.

    Merci

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    bonjour, je pense que le "renommage des symboles" des fonctions de la librairie provient du name manging (le compilateur c++ "décore" les noms de fonctions avec des indicateurs liés aux arguments, types de retour, etc pour permettre l'overloading, qui n'existe pas en C).
    Il faudrait déclarer les fonctions point d'entrée de la lib avec le marqueur suivant, sauf erreur de ma part:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    extern "C" int compterLesMoutons();

  3. #3
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Oui, puisque c'est toute une librairie qui est concernée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // au début du fichier
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    ...
     
    // a la fin du fichier
    #ifdef __cplusplus
    }
    #endif
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Super merci

    J'ai juste eu à encadrer tout le contenu du fichier entête (.h) de la librairie liblist par un "extern "C" {..}" et ça a marché du premier coup.

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

Discussions similaires

  1. Conversion d'une chaine de char en numerique
    Par simone.51 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 25/03/2004, 16h47
  2. Creer et utiliser une librairie externe à l'exécutable
    Par multani dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 06/11/2003, 10h11
  3. Utiliser une librairie graphique
    Par Troopers dans le forum Linux
    Réponses: 6
    Dernier message: 22/08/2003, 11h22
  4. Réponses: 5
    Dernier message: 11/03/2003, 11h49
  5. inclure une librairie *.lib
    Par darkbm dans le forum C
    Réponses: 2
    Dernier message: 16/12/2002, 22h48

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