2010-09-15 5 views
12

Mam problem z statycznym połączeniem aplikacji korzystającej z bibliotek doładowania 1.35. Używam debianowego systemu Lenny Box, z G ++ 4.3.2. Łączenie bez -static działa bez żadnych problemów.Łączenie z barfami doładowania z "niezdefiniowanym odniesieniem do` boost :: system :: get_system_category() '

szczególności

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

mam łączenie przeciwko boost_system-MT, który znajduje się na mojej skrzynce w/usr/lib. To samo dzieje się, jeśli odwołuje się przeciw non-safe wielowątkowym wersji 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 

I znaleźć nierozwiązane symbole tam

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

strace pokazuje, że łącznik otwiera bibliotekę

[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 

To standardową instalację pakietów z impuls w Debianie,

[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 

Jestem pewien, że brakuje mi głupiego szczegółu, ale nie mogę go znaleźć. Ktoś pomoże?

Odpowiedz

18

Podczas statycznego łączenia linkera oczekuje, że biblioteki przyjdą po pliki zawierające odniesienia do nich. Musisz przenieść swoje pliki .o przed flagami -l. Chodzi o to, że pliki, które przychodzą później "wypełniają" odniesienia zawarte we wcześniejszych plikach - ponieważ twoje pliki .o są ostatnie, linker oczekuje od nich uzupełnienia brakujących symboli w boost_system, a nie odwrotnie. Kiedy dynamicznie łączysz, kolejność nie ma znaczenia, ponieważ nie rozstrzyga symbolu, dopóki nie zostanie użyty po raz pierwszy w czasie wykonywania (i do tego czasu będzie znał pełną listę bibliotek do wyszukiwania symboli).

+0

D'oh! . Działa teraz pięknie. –

Powiązane problemy