Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/10/2011, à 01:19

ehmicky

[Résolu][C++]Pb de linking avec boost::thread ("undefined reference")

Bonjour à tous,

J'ai des problème de linking quand j'essai de compiler ce programme :

$ cat a.cpp
#include    <boost/thread.hpp>
int main(void)
{
    boost::thread Thread;
  return 0;    
}
$ g++ -lboost_thread a.cpp
/tmp/ccyp8EpS.o: In function `main':
a.cpp:(.text+0x11): undefined reference to `boost::thread::thread()'
a.cpp:(.text+0x22): undefined reference to `boost::thread::~thread()'
collect2: ld returned 1 exit status
$ g++ /usr/lib/libboost_thread.so.1.46.1 a.cpp
/tmp/cc6KpfXx.o: In function `main':
a.cpp:(.text+0x11): undefined reference to `boost::thread::thread()'
a.cpp:(.text+0x22): undefined reference to `boost::thread::~thread()'
collect2: ld returned 1 exit status

Pourtant boost::thread est bien installé :

$ ls -l /usr/lib/libboost_thread*
-rw-r--r-- 1 root root 212006 2011-06-03 23:30 /usr/lib/libboost_thread.a
lrwxrwxrwx 1 root root     17 2011-06-03 23:30 /usr/lib/libboost_thread-mt.a -> libboost_thread.a
lrwxrwxrwx 1 root root     25 2011-06-03 23:30 /usr/lib/libboost_thread-mt.so -> libboost_thread.so.1.46.1
lrwxrwxrwx 1 root root     25 2011-06-03 23:30 /usr/lib/libboost_thread.so -> libboost_thread.so.1.46.1
-rw-r--r-- 1 root root 101240 2011-06-03 23:30 /usr/lib/libboost_thread.so.1.46.1

La librairie contient bien des symboles pour un boost::thread avec des constructors et destructors :

$ strings /usr/lib/libboost_thread.so.1.46.1 | grep boost6thread
_ZN5boost6threadC2Ev
_ZNK5boost6thread15get_thread_infoEv
_ZNK5boost6thread8joinableEv
_ZN5boost6thread20hardware_concurrencyEv
_ZNK5boost6thread6get_idEv
_ZN5boost6thread12start_threadEv
_ZN5boost6thread13native_handleEv
_ZNK5boost6thread22interruption_requestedEv
_ZN5boost6thread9interruptEv
_ZN5boost6thread6detachEv
_ZN5boost6threadD2Ev
_ZN5boost6thread10timed_joinERKNS_10posix_time5ptimeE
_ZN5boost6thread4joinEv
_ZN5boost6threadC1Ev
_ZN5boost6threadD1Ev

J'ai essayé de apt-get remove libboost-thread (runtime + dev), de supprimer les paquets en cache dans /var/cache/apt/archives/, et de refaire un apt-get install, mais rien à faire. J'ai aussi essayé en compilant depuis les sources de la 1.47
J'ai essayé aussi de rajouter l'option -lpthread, sans succès.

Merci beaucoup ! smile

Dernière modification par ehmicky (Le 22/10/2011, à 14:46)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#2 Le 22/10/2011, à 07:20

omc

Re : [Résolu][C++]Pb de linking avec boost::thread ("undefined reference")

Bonjour,
Tu n'es pas le seul à avoir des problème de link avec la nouvelle version du paquet boost-dev (http://forum.ubuntu-fr.org/viewtopic.php?id=680981).
Même si c'est peu probable, je me demande si la lib n'a pas été mal empaquetté.

À creuser.

Dernière modification par omc (Le 22/10/2011, à 07:21)

Hors ligne

#3 Le 22/10/2011, à 12:48

ehmicky

Re : [Résolu][C++]Pb de linking avec boost::thread ("undefined reference")

C'est ce que j'ai pensé aussi, mais j'ai téléchargé tout Boost 1.47 et compilé depuis les sources, et j'ai eu le même problème.
En plus, j'ai l'impression que cela concerne que la classe boost::thread, pas les autres (boost::unique_lock, etc.).
Le problème, c'est que c'est dur de trouver des infos sur Google, parce que la plupart des gens qui ont ce problème ont simplement oublier de lier la bibliothèque :-|

Edit : en regardant les sources, j'ai l'impression que les constructors et destructors de boost::thread sont déclarés mais pas définis. Ca me parait un peu gros pour une bibliothèque comme Boost ! Je vais regarder ça de plus près smile

Dernière modification par ehmicky (Le 22/10/2011, à 12:56)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#4 Le 22/10/2011, à 13:17

eiger

Re : [Résolu][C++]Pb de linking avec boost::thread ("undefined reference")

En essayant comme ceci (placer les bibliothèques en fin de ligne) :

g++ a.cpp -lboost_thread 

qu'est-ce que ça donne ?

GCC 4.6 (utilisé sur 11.10 il me semble) est beaucoup plus pointilleux sur les options destinées au linker.
Je n'ai pas encore migré à Oneiric, donc je ne peux pas tester chez moi.

Hors ligne

#5 Le 22/10/2011, à 14:45

ehmicky

Re : [Résolu][C++]Pb de linking avec boost::thread ("undefined reference")

Salut,

C'est ça, problème résolu ! smile
Je comprends que la résolution des symboles se fait de droite à gauche, cependant ld est sensé être un "smart linker" et pouvoir résoudre ce genre de problème de dépendance lors du linktime (et d'ailleurs le fait la plupart du temps) :
  - Quels sont les cas précis pour lesquels ld se mêle les pinceaux ?
  - Lorsque l'on crée une bibliothèque, comment éviter que cela survienne (et donc faire en sorte que nos utilisateurs puissent lier la bibliothèque en la mettant à n'importe quel endroit de la ligne de commande) ?

Dernière modification par ehmicky (Le 22/10/2011, à 14:58)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#6 Le 22/10/2011, à 15:29

eiger

Re : [Résolu][C++]Pb de linking avec boost::thread ("undefined reference")

Bon, cela confirme donc mes soupçons.
D'après ce qu'on peut trouver sur d'autres forums, dans Ubuntu 11.10, ld utilise l'option "--as-needed" par défaut, ce qui n'était pas le cas dans les versions précédentes d'Ubuntu.

L'effet est le suivant : les bibliothèques ne sont réellement liées que si elles permettent de satisfaire un ou plusieurs symboles non résolus rencontrés précédemment. Avant (donc avec l'option --no-as-needed), les bibliothèques étaient liées dans tous les cas, qu'elles soient utiles ou non.

Donc quand on appelle :

g++ -lboost_thread a.cpp

ld rencontre boost_thread avant a.o et considère que boost_thread ne sert à rien, puisque qu'il n'y a encore aucune dépendance non satisfaite. Donc il élimine boost_thread et il ne reste plus que a.o.

Tu peux retrouver le comportement précédent en passant "--no-as-needed" à ld, soit "-Wl,--no-as-needed" à g++.

Hors ligne

#7 Le 22/10/2011, à 15:46

ehmicky

Re : [Résolu][C++]Pb de linking avec boost::thread ("undefined reference")

Donc si je comprends bien, c'est le maintainer Ubuntu de ld qui est en faute smile ?


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#8 Le 22/10/2011, à 15:57

eiger

Re : [Résolu][C++]Pb de linking avec boost::thread ("undefined reference")

ehmicky a écrit :

Donc si je comprends bien, c'est le maintainer Ubuntu de ld qui est en faute smile ?

Non pas vraiment, c'est un choix assumé smile
En fait le changement aurait dû se faire avec Natty mais devant l'ampleur des problèmes que cela posait, il a finalement été repoussé à Oneiric (voir https://lists.ubuntu.com/archives/ubunt … 32632.html)

Hors ligne

#9 Le 22/10/2011, à 15:59

omc

Re : [Résolu][C++]Pb de linking avec boost::thread ("undefined reference")

Cool... Un mystère de résolu !

Hors ligne