2010-09-15 120 views
12

我无法静态链接使用boost 1.35库的应用程序。我用的是G ++ 4.3.2,它使用的是linux debian Lenny框。链接没有-static工作顺利。通过'boost :: system :: get_system_category()'的未定义引用链接到boost barfs

具体来说,

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

我链接到的boost_system-MT,这是我在/ usr/lib目录里发现。同样的事情发生,如果我对链接的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 

而且我发现尚未解决的符号有

[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的显示了链接打开库

[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 

这是在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 

我确定我错过了一个愚蠢的细节,但我找不到它。有人帮忙吗?

回答

18

静态链接链接程序期望库会包含对它们的引用的文件。您需要在-l标志之前移动.o文件。这个想法是稍后的文件'填写'早期文件中包含的引用 - 因为你的.o文件是最后一个,链接器期望它们填充boost_system中的所有缺失符号,而不是相反。当你动态地链接时,顺序并不重要,因为它不会解析符号,直到它第一次在运行时使用它(到那时它知道要在其中查找符号的库的完整列表)。

+0

D'oh! <拍额头>。现在精美的作品。 – 2010-09-15 15:40:06

相关问题