2010-09-15 13 views
12

Tengo problemas para vincular estáticamente una aplicación que usa las bibliotecas de impulso 1.35. Estoy usando un cuadro Lenny Debian Lenny, con G ++ 4.3.2. El enlace sin -static funciona sin problemas.Vinculación con Barfs de refuerzo con 'referencia indefinida a `boost :: system :: get_system_category()'

Específicamente,

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()' 

estoy ligado con boost_system-mt, que se encuentra en mi caja en/usr/lib. Lo mismo sucede si enlazar con la versión no multi-hilo-seguro del boost_system (-lboost_system)

[email protected]:~/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 

Y me encuentro con los símbolos sin resolver no

[email protected]:~/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 muestra que el enlazador se abre la biblioteca

[email protected]:~/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 

es una instalación de paquete estándar de impulso en debian,

[email protected]:~/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 

Estoy seguro de que me estoy perdiendo un detalle estúpido, pero no puedo encontrarlo. ¿Alguien ayuda?

Respuesta

18

Cuando se vinculan estáticamente el vinculador espera que las bibliotecas vendrán después de los archivos que contienen referencias a ellos. Necesita mover sus archivos .o antes de sus -l flags. La idea es que los archivos que vienen después rellenen las referencias contenidas en los archivos anteriores, ya que sus archivos .o son los últimos, el vinculador espera que completen los símbolos que faltan en el sistema boost y no al revés. Cuando se vincula dinámicamente, el orden no importa porque no resuelve un símbolo hasta la primera vez que se utiliza en tiempo de ejecución (y para ese momento conoce la lista completa de bibliotecas para buscar símbolos).

+0

D'oh! . Funciona hermosamente ahora. –

Cuestiones relacionadas