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 compilation/linkage avec boost::thread


Sujet :

Boost C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Points : 37
    Points
    37
    Par défaut Problème de compilation/linkage avec boost::thread
    Bonsoir,
    Je suis débutant avec boost, et je tente de compiler un premier programme :
    voici mon fichier main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <boost/thread.hpp>
    #include <iostream>
    using namespace std;
     
    void test(){
    	cout << "coucou" << endl;
    }
     
     
    int main(){
    	boost::thread t(&test);
    	return 0;
    }
    J'ai installé boost "normalement" sur ubuntu 9.10, par le gestionnaire de packet (libboost-dev)

    Voici ce que j'obtient :
    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
    g++ test.cpp 
    /tmp/cc37OBcu.o: In function `main':
    test.cpp:(.text+0x5d): undefined reference to `boost::thread::~thread()'
    /tmp/cc37OBcu.o: In function `boost::mutex::mutex()':
    test.cpp:(.text._ZN5boost5mutexC1Ev[boost::mutex::mutex()]+0x4b): undefined reference to `boost::thread_resource_error::thread_resource_error()'
    test.cpp:(.text._ZN5boost5mutexC1Ev[boost::mutex::mutex()]+0x50): undefined reference to `boost::thread_resource_error::~thread_resource_error()'
    test.cpp:(.text._ZN5boost5mutexC1Ev[boost::mutex::mutex()]+0x55): undefined reference to `typeinfo for boost::thread_resource_error'
    /tmp/cc37OBcu.o: In function `boost::condition_variable::condition_variable()':
    test.cpp:(.text._ZN5boost18condition_variableC1Ev[boost::condition_variable::condition_variable()]+0x3f): undefined reference to `boost::thread_resource_error::thread_resource_error()'
    test.cpp:(.text._ZN5boost18condition_variableC1Ev[boost::condition_variable::condition_variable()]+0x44): undefined reference to `boost::thread_resource_error::~thread_resource_error()'
    test.cpp:(.text._ZN5boost18condition_variableC1Ev[boost::condition_variable::condition_variable()]+0x49): undefined reference to `typeinfo for boost::thread_resource_error'
    /tmp/cc37OBcu.o: In function `boost::detail::thread_data_base::thread_data_base()':
    test.cpp:(.text._ZN5boost6detail16thread_data_baseC2Ev[boost::detail::thread_data_base::thread_data_base()]+0x26): undefined reference to `vtable for boost::detail::thread_data_base'
    /tmp/cc37OBcu.o: In function `boost::thread::thread<void (*)()>(void (*)(), boost::disable_if<boost::is_convertible<void (*&)(), boost::detail::thread_move_t<void (*)()> >, boost::thread::dummy*>::type)':
    test.cpp:(.text._ZN5boost6threadC1IPFvvEEET_NS_10disable_ifINS_14is_convertibleIRS4_NS_6detail13thread_move_tIS4_EEEEPNS0_5dummyEE4typeE[boost::thread::thread<void (*)()>(void (*)(), boost::disable_if<boost::is_convertible<void (*&)(), boost::detail::thread_move_t<void (*)()> >, boost::thread::dummy*>::type)]+0x42): undefined reference to `boost::thread::start_thread()'
    /tmp/cc37OBcu.o: In function `boost::detail::thread_data<void (*)()>::~thread_data()':
    test.cpp:(.text._ZN5boost6detail11thread_dataIPFvvEED1Ev[boost::detail::thread_data<void (*)()>::~thread_data()]+0x1f): undefined reference to `boost::detail::thread_data_base::~thread_data_base()'
    /tmp/cc37OBcu.o: In function `boost::detail::thread_data<void (*)()>::~thread_data()':
    test.cpp:(.text._ZN5boost6detail11thread_dataIPFvvEED0Ev[boost::detail::thread_data<void (*)()>::~thread_data()]+0x1f): undefined reference to `boost::detail::thread_data_base::~thread_data_base()'
    /tmp/cc37OBcu.o:(.rodata._ZTIN5boost6detail11thread_dataIPFvvEEE[typeinfo for boost::detail::thread_data<void (*)()>]+0x10): undefined reference to `typeinfo for boost::detail::thread_data_base'
    collect2: ld returned 1 exit status
    Je pensais qu'il falait passer un "-lboost" par exemple, mais j'ai lu que il n'y en avais pas besoin sauf quelques cas particuliers... Du coup, je sais pas.

    J'ai vu beaucoup de forum avec ce genre de problème, mais trouvé aucune solution...

    Merci de votre aide !

  2. #2
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    les packages ubuntu ont tous 56 versions de retard, donc passe plutot par la tarball de la dernière release.

    Ensuite c'ets pas -lboost, mais -lboost_zzz_xxx_yyy

    zzz : nom de la bibliothèque
    xxx : version du compilo
    yyy : version multithread ou pas.

    donc sous ubuntu, je tenterais un -lboost_thread_gcc44_mt

    cf:

    http://www.boost.org/doc/libs/1_38_0...-variants.html

    http://www.boost.org/doc/libs/1_38_0...-boost-library

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par Joel F Voir le message
    donc sous ubuntu, je tenterais un -lboost_thread_gcc44_mt
    Merci pour ta réponse. Ça n'a pas fonctionné directement, mais ça m'a donné une idée : aller voir dans /usr/lib et finalement la solution est

    Si ça peut servir à quelqu'un. Je trouve domage que les différents tuto du site ne précisent pas du tout cette étape (ou alors j'ai raté quelque-chose).

    Merci !

  4. #4
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    L'etape d'edition des liens c'ets le b-a-ba de la compialtion de TOUT. C'est comme si tu reprochais au tuto de pas te dire comment compiler ...

    Ca sent la génération IDE tout ça [:smiley à moustache ironique]

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par theanthony33 Voir le message
    Je trouve domage que les différents tuto du site ne précisent pas du tout cette étape (ou alors j'ai raté quelque-chose).
    Je travaille sous Windows avec Visual Studio et l'édition de lien ne se fait pas du tout comme cela. Un tuto, malgré toute la bonne volonté du rédacteur, ne pourra jamais être complet pour toutes les plateformes et tous les environnements de développement.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par Joel F Voir le message
    L'etape d'edition des liens c'ets le b-a-ba de la compialtion de TOUT. C'est comme si tu reprochais au tuto de pas te dire comment compiler ...

    Ca sent la génération IDE tout ça [:smiley à moustache ironique]
    ça sent surtout le mec qui fait surtout du php... Mais c'est vrai que j'ai jamais vraiment appris a compiler pour les vrais langages, sans ide.

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Salut,

    En fait, il faut comprendre que l'édition de liens est dépendante du système.

    Typiquement, on trouve deux politiques majeures pour l'édition de liens:

    LD (l'éditeur de liens de linux) ou GOLD vont chercher des bibliothèques sous le nom de libXXXX.a
    Les éditeurs de liens "microsoft like" (link sous visual, je ne sais plus son nom sous borland) von chercher, pour la même bibliothèque, XXXX.lib

    Et il n'est pas exclu que d'autres éditeurs de liens (celui fourni par comau ou par le intell, par exemple) utilise d'autres conventions de nommage.

    (il faut noter que, lorsque tu travailles avec MinGW, qui est le portage sous windows de Gcc, tu travailles également avec ld, et qu'il suit donc la même politique que sous linux)

    Ensuite, il y a toute la politique de nommage propre à la bibliothèque (par exemple, boost indique les numéros de version principal et secondaire).

    Enfin, il y a la possibilité (ou non) de créer des liens symboliques, à l'instar de ce que permet les unixoïdes, qui peut permettre de "faire pointer" un nom sans numéro de version vers une bibliothèque dont le nom en contient un, et qui peut donc permettre d'avoir trente six versions différentes de la bibliothèque, sans avoir à se préoccuper du numéro précis de la dernière, tant qu'on ne veut pas travailler avec une version plus ancienne.

    Si l'on devait prendre tous ces points en compte de manière exhaustive, ce ne serait sans doute plus un tutorial, mais un véritable annuaire téléphonique

    ... Et encore faudrait-il trouver quelqu'un qui maitrise suffisamment les différents environnements pour arriver à l'écrire
    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

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Points : 37
    Points
    37
    Par défaut
    Merci pour ces quelques précisions

    J'ai encore une petite demande : si j'ai bien compris, une compilation statique permettrai d'utiliser mon programme sans aucune lib installée chez le client, mais au prix d'un executable plus gros ? j'ai bon ?

    Est il possible de faire ça facilement avec une option de g++ ? C'est une question comme ça pas sur que je l'utilise après. Ça dépend si les libs d'exécution de boost sont installées chez beaucoup de monde ?!

    Merci encore pour votre aide.

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

Discussions similaires

  1. Problème lors du link avec Boost thread.
    Par Andarus dans le forum Boost
    Réponses: 1
    Dernier message: 16/02/2012, 16h43
  2. Problème de lib avec Boost::thread
    Par TocTocKiéLà? dans le forum Boost
    Réponses: 5
    Dernier message: 14/08/2007, 01h05
  3. Problème pour compiler Ogre avec VS 2005
    Par Oxideur dans le forum Ogre
    Réponses: 2
    Dernier message: 01/03/2007, 18h33
  4. Questions de perfomance avec boost::thread
    Par Rafy dans le forum Boost
    Réponses: 36
    Dernier message: 05/10/2006, 15h21
  5. [Avis aux pros !] Problèmes de la VCL avec les threads
    Par benj63 dans le forum C++Builder
    Réponses: 3
    Dernier message: 17/02/2006, 22h38

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