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

Boost C++ Discussion :

Problème de linkage avec la lib regex


Sujet :

Boost C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 21
    Par défaut Problème de linkage avec la lib regex
    Bonjour,

    Voici quelques jours que j'essaie de compiler un programme ressorti des cartons qui utilise entre autre les librairies program-options, filesystem, thread et regex de boost.

    Après avoir téléchargé et buildé la nouvelle version de boost, le programme se compile normalement (sans problème de compatibilité, si c'est pas beau la vie) mais arrivé à la phase du linkage, j'obtiens les joyeuses erreurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    C:\Boost\lib\libboost_regex-mgw34-mt-1_36.lib(instances.o):instances.cpp:(.text+0x1b): référence indéfinie vers « __gxx_personality_sj0 »
    C:\Boost\lib\libboost_regex-mgw34-mt-1_36.lib(instances.o):instances.cpp:(.text+0x34): référence indéfinie vers « _Unwind_SjLj_Register »
    C:\Boost\lib\libboost_regex-mgw34-mt-1_36.lib(instances.o):instances.cpp:(.text+0x52): référence indéfinie vers « _Unwind_SjLj_Unregister »
    C:\Boost\lib\libboost_regex-mgw34-mt-1_36.lib(instances.o):instances.cpp:(.text+0xa7): référence indéfinie vers « _Unwind_SjLj_Resume »
    C:\Boost\lib\libboost_regex-mgw34-mt-1_36.lib(instances.o):instances.cpp:(.text+0xcb): référence indéfinie vers « __gxx_personality_sj0 »
    C:\Boost\lib\libboost_regex-mgw34-mt-1_36.lib(instances.o):instances.cpp:(.text+0xe4): référence indéfinie vers « _Unwind_SjLj_Register »
    C:\Boost\lib\libboost_regex-mgw34-mt-1_36.lib(instances.o):instances.cpp:(.text+0x102): référence indéfinie vers « _Unwind_SjLj_Unregister »
    C:\Boost\lib\libboost_regex-mgw34-mt-1_36.lib(instances.o):instances.cpp:(.text+0x157): référence indéfinie vers « _Unwind_SjLj_Resume »
    C:\Boost\lib\libboost_regex-mgw34-mt-1_36.lib(instances.o):instances.cpp:(.text+0x178): référence indéfinie vers « __gxx_personality_sj0 »
    C:\Boost\lib\libboost_regex-mgw34-mt-1_36.lib(instances.o):instances.cpp:(.text+0x194): référence indéfinie vers « _Unwind_SjLj_Register »
    C:\Boost\lib\libboost_regex-mgw34-mt-1_36.lib(instances.o):instances.cpp:(.text+0x1ce): référence indéfinie vers « _Unwind_SjLj_Unregister »
    C:\Boost\lib\libboost_regex-mgw34-mt-1_36.lib(instances.o):instances.cpp:(.text+0x1fe): référence indéfinie vers « _Unwind_SjLj_Resume »
    suivies par d'autres un peu moins sexy (comme par exemple C:\Boost\lib\libboost_regex-mgw34-mt-1_36.lib(instances.o):instances.cpp.text$_ZN5boost9re_detail21cpp_regex_traits_baseIcE5imbueERKSt6locale).

    Je travaille avec code::blocks dernière version (10.05), version 1.44 de boost, le tout avec le compilateur mingw 5.1.3.

    J'ai bien entendu ajouté au linker les librairies de boost nécessaires (puis par la suite toutes pour éliminer un problème de dépendances), mais rien à faire, la librairie regex pose problème...

    Si quelqu'un a donc une idée, merci d'avance de votre aide.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Salut,

    Pour autant que je m'en souvienne, boost.regex et boost.filesystem (au minimum, il me semble qu'il en va de même pour boost.program_options) sont des bibliothèques qui, à l'inverse de la plupart des autres, ne peuvent se contenter d'un système "headers only".

    Il faut donc effectuer une liaison explicite avec ces bibliothèques qui, toujours sous réserve d'une erreur de ma part, n'existent que sous la forme de dll's.

    Tu devrais donc vérifier si ta commande de compilation contient bien:
    • - l'option -L donnant le chemin vers le dossier dans lequel se trouvent libboost-regex.x.y.z.a et libboost-filesystem.x.y.z.a
    • - l'option -l (L minuscule) indiquant qu'il faut effectuer la liaison avec boost.regex (ex: -lboost_regex-mgw45-1_44)
    • l'option -l (L minuscule) indiquant qu'il faut effectuer la liaison avec boost.filesystem ( ex: -lboost_filesystem-mgw45-1_44)
    • sans doute l'option -l indiquant qu'il faut eeffectuer la liaison avec boost.program_options (ex: -lboost_program_options-mgw45-1_44 )
    Tu devra ensuite vérifier que les dll correspondantes (libboost_regex-mgw45-1_44.dll, libboost_filesystem-mgw45-1_44.dll et libboost_program_options-mgw45-1_44.dll) soient dans des dossiers accessibles par ton application (typiquement: dans le dossier dans lequel se trouve ton exécutable ou dans un des dossiers définis dans la variable PATH)

    [EDIT]Comme tu utilise boost-thread, les bibliothèques qui risquent de t'intéresser devraient aussi être multi-threadées

    Ce serait donc plutôt respectivement -lboost_regex-mgw45-1_44-mt -lboost_filesystem-mgw45-1_44-mt et -lboost_program_options-mgw45-1_44-mt (pour l'édition de liens) et les dll libboost_regex-mgw45-1_44-mt.dll, libboost_filesystem-mgw45-1_44-mt.dll et libboost_program_options-mgw45-1_44-mt.dll qu'il faudrait utiliser...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    C:\Boost\lib\libboost_regex-mgw34-mt-1_36.lib

    alors que tu utilises boost 1.44 c'est ça ton problème

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Citation Envoyé par guillaume07 Voir le message
    C:\Boost\lib\libboost_regex-mgw34-mt-1_36.lib

    alors que tu utilises boost 1.44 c'est ça ton problème
    Si ce n'est que c'est moi qui ai utilisé de fausses valeurs (ce sont celles que j'utilise personnellement ) dans mes différents exemples

    Je n'avais pas trop fait attention à la version qu'il utilisait

    Mais il faut effetivement veiller à effectuer la liaison avec les bonnes versions des différentes bibliothèques de boost
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Si ce n'est que c'est moi qui ai utilisé de fausses valeurs (ce sont celles que j'utilise personnellement ) dans mes différents exemples

    Je n'avais pas trop fait attention à la version qu'il utilisait

    Mais il faut effetivement veiller à effectuer la liaison avec les bonnes versions des différentes bibliothèques de boost
    justement il utilise 1.44 et il essaye de linker avec regex-1.36 =>

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 21
    Par défaut
    Merci pour vos réponses!

    koala tu m'as mis la puce à l'oreille :p effectivement contrairement à ce que je croyais il y avait deux versions de boost qui coexistaient sur mon disque. J'ai donc viré tout ce qui était ancien, et j'ai bien utilisé et linké avec les headers/librairies de boost 1.44.

    Beaucoup de messages d'erreur ont disparus, il me reste néanmoins quelques problèmes avec la librairie boost_thread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    c:/mingw/bin/../lib/gcc/mingw32/4.5.0/../../../../mingw32/bin/ld.exe: warning: auto-importing has been activated without --enable-auto-import specified on the command line.
    This should work unless it involves constant data structures referencing symbols from auto-imported DLLs.
    obj\Release\include\dispatcher.o:dispatcher.cpp:(.text+0x1067): référence indéfinie vers « _imp___ZN5boost6thread4joinEv »
    obj\Release\include\dispatcher.o:dispatcher.cpp:(.text+0x1611): référence indéfinie vers « _imp___ZN5boost6thread12start_threadEv »
    obj\Release\include\dispatcher.o:dispatcher.cpp:(.text+0x2400): référence indéfinie vers « _imp___ZN5boost6threadD1Ev »
    obj\Release\include\dispatcher.o:dispatcher.cpp:(.text+0x241e): référence indéfinie vers « _imp___ZN5boost6threadD1Ev »
    (dispatcher.cpp/dispatcher.o sont des fichiers de mon projet)
    si quelqu'un a une idée encore une fois...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 21
    Par défaut
    Je suis tombé sur un forum allemand ou quelqu'un avait le même problème, apparemment il faut définir via le précompilo comme ce qui suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define BOOST_THREAD_USE_LIB
    pour indiquer que l'on veut linker en static (ce qui est mon cas). Mais j'obtiens maintenant comme erreur : collect2-ld-returned-1-exit-status

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 21
    Par défaut
    Mon problème est résolu, j'ai effectué une série de manip donc je ne sais pas laquelle a été décisive :

    -corriger une partie du code de boost (cf la solution donnée dans les commentaires de https://svn.boost.org/trac/boost/ticket/4258)
    -recompiler proprement et complètement boost ensuite (librairie statiques et librairies dynamiques)
    -spécifier au linker d'utiliser les librairies version link-static et multi-thread
    -ne pas oublier le #define BOOST_THREAD_USE_LIB en début de programme

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

Discussions similaires

  1. [NASM / Linux] Problème de linkage avec lib C
    Par donkeyquote dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 01/11/2008, 15h09
  2. Problème de linkage avec template
    Par Invité dans le forum Langage
    Réponses: 4
    Dernier message: 05/01/2008, 16h34
  3. Problème de linkage avec g++
    Par GarulfoLinux dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 08/08/2007, 19h57
  4. Problème au linkage avec mfc42d
    Par GLDavid dans le forum VC++ .NET
    Réponses: 6
    Dernier message: 04/01/2007, 11h32
  5. Problème de linkage avec la librairie DevIl
    Par Drannor dans le forum DevIL
    Réponses: 1
    Dernier message: 18/01/2006, 23h05

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