#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 !
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
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 !
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 ?
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")
Donc si je comprends bien, c'est le maintainer Ubuntu de ld qui est en faute
?
Non pas vraiment, c'est un choix assumé
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