La liaison à l'encontre de boost barfs avec " undefined reference to `boost::system::get_system_category()'
Je vais avoir de la difficulté à liaison statique d'une application qui utilise le boost 1.35 bibliothèques. Je suis sur un linux debian Lenny boîte, avec G++ 4.3.2. La liaison sans -statique fonctionne sans accroc.
Plus précisément,
g++ -Wall -Wextra -pedantic -ggdb3 -O0 -static -l boost_thread-mt -lboost_system-mt -lboost_program_options-mt -lssl -lpthread -l crypto main.o comandos.o utils.o tunnel.o opciones.o decode.o sysutils.o -o sapp
main.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost/system/error_code.hpp:204:undefined reference to `boost::system::get_system_category()'
/usr/include/boost/system/error_code.hpp:205: undefined reference to `boost::system::get_posix_category()'
/usr/include/boost/system/error_code.hpp:209: undefined reference to `boost::system::get_posix_category()'
/usr/include/boost/system/error_code.hpp:210: undefined reference to `boost::system::get_system_category()'
Je suis un lien contre boost_system-mt, ce qui est trouvé sur ma boîte dans /usr/lib. La même chose se passe si j'ai un lien à l'encontre de la non multi thread-safe version de boost_system (-lboost_system)
sarraga@saggy:~/sapp/src$ ls -al /usr/lib/libboost_system*a
-rw-r--r-- 1 root root 23506 2008-05-23 05:32 /usr/lib/libboost_system.a
lrwxrwxrwx 1 root root 17 2010-08-26 19:10 /usr/lib/libboost_system-gcc42-1_35.a -> libboost_system.a
lrwxrwxrwx 1 root root 20 2010-08-26 19:10 /usr/lib/libboost_system-gcc42-mt-1_35.a -> libboost_system-mt.a
-rw-r--r-- 1 root root 23506 2008-05-23 05:32 /usr/lib/libboost_system-mt.a
Et je trouve que le suspens symboles il y
sarraga@saggy:~/sapp/src$ nm -C /usr/lib/libboost_system-mt.a | grep 'T.*get.*category'
00000050 T boost::system::get_posix_category()
000000b0 T boost::system::get_system_category()
Un strace montre que l'éditeur de liens ouvre la bibliothèque
sarraga@saggy:~/sapp/src$ strace -f make 2>&1 | grep boost_system
[pid 15016] execve("/usr/bin/g++", ["g++", "-Wall", "-Wextra", "-pedantic", "-ggdb3", "-O0", "-static", "-l", "boost_thread-mt", "-lboost_system-mt", "-lboost_program_options-mt", "-lssl", "-lpthread", "-l", "crypto", "main.o", ...], [/* 41 vars */] <unfinished ...>
...
[pid 15018] open("/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../lib/libboost_system-mt.a", O_RDONLY|O_LARGEFILE) = 8
C'est un paquet standard d'installation de boost dans debian,
sarraga@saggy:~/sapp/src$ dpkg -l | grep boos
ii libboost-date-time1.35-dev 1.35.0-5 set of date-time libraries based on generic programming
ii libboost-date-time1.35.0 1.35.0-5 set of date-time libraries based on generic programming
ii libboost-filesystem1.35-dev 1.35.0-5 filesystem operations (portable paths, iteration over d
ii libboost-filesystem1.35.0 1.35.0-5 filesystem operations (portable paths, iteration over d
ii libboost-graph1.35-dev 1.35.0-5 generic graph components and algorithms in C++
ii libboost-graph1.35.0 1.35.0-5 generic graph components and algorithms in C++
ii libboost-iostreams1.35-dev 1.35.0-5 Boost.Iostreams Library development files
ii libboost-iostreams1.35.0 1.35.0-5 Boost.Iostreams Library
ii libboost-program-options1.35-dev 1.35.0-5 program options library for C++
ii libboost-program-options1.35.0 1.35.0-5 program options library for C++
ii libboost-python1.35-dev 1.35.0-5 Boost.Python Library development files
ii libboost-python1.35.0 1.35.0-5 Boost.Python Library
ii libboost-regex1.35-dev 1.35.0-5 regular expression library for C++
ii libboost-regex1.35.0 1.35.0-5 regular expression library for C++
ii libboost-serialization1.35-dev 1.35.0-5 serialization library for C++
ii libboost-serialization1.35.0 1.35.0-5 serialization library for C++
ii libboost-signals1.35-dev 1.35.0-5 managed signals and slots library for C++
ii libboost-signals1.35.0 1.35.0-5 managed signals and slots library for C++
ii libboost-system1.35-dev 1.35.0-5 Operating system (e.g. diagnostics support) library
ii libboost-system1.35.0 1.35.0-5 Operating system (e.g. diagnostics support) library
ii libboost-test1.35-dev 1.35.0-5 components for writing and executing test suites
ii libboost-test1.35.0 1.35.0-5 components for writing and executing test suites
ii libboost-thread1.35-dev 1.35.0-5 portable C++ multi-threading
ii libboost-thread1.35.0 1.35.0-5 portable C++ multi-threading
ii libboost-wave1.35-dev 1.35.0-5 C99/C++ preprocessor library
ii libboost-wave1.35.0 1.35.0-5 C99/C++ preprocessor library
ii libboost1.35-dev 1.35.0-5 Boost C++ Libraries development files
ii libboost1.35-doc 1.35.0-5 Boost.org libraries documentation
Je suis sûr que je suis absent une stupide détail, mais je ne le trouve pas. - On aider?
OriginalL'auteur Santiago Árraga | 2010-09-15
Vous devez vous connecter pour publier un commentaire.
Lorsque la liaison statique de l'éditeur de liens s'attend à ce que les bibliothèques ne seront venir une fois que les fichiers contenant des références. Vous avez besoin de déplacer votre .o les fichiers avant de les votre -l drapeaux. L'idée est que les fichiers qui viennent plus tard 'remplir' les références contenues dans les précédents fichiers, depuis votre .o sont les fichiers dernier, l'éditeur de liens attend d'eux de remplir tous les symboles manquants dans boost_system plutôt que vice versa. Lorsque vous lier dynamiquement, l'ordre n'a pas d'importance car il n'est pas résoudre un symbole jusqu'à ce que la première fois qu'il est utilisé lors de l'exécution (et à cette époque il connaît la liste complète des bibliothèques de regarder pour les symboles).
OriginalL'auteur Joseph Garvin