【问题标题】:Linking against boost barfs with 'undefined reference to `boost::system::get_system_category()'使用“未定义的对 `boost::system::get_system_category()' 的引用来链接 boost barfs
【发布时间】:2011-04-12 18:01:02
【问题描述】:

我在静态链接使用 boost 1.35 库的应用时遇到问题。我正在使用带有 G++ 4.3.2 的 linux debian Lenny 盒子。没有 -static 的链接可以顺利进行。

具体来说,

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) 的非多线程安全版本,也会发生同样的事情

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

我在那里找到了未解析的符号

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

一个 strace 显示链接器打开了库

 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

是debian中boost的标准安装包,

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

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

【问题讨论】:

    标签: c++ boost linker static-linking


    【解决方案1】:

    当静态链接时,链接器期望库将出现在包含对它们的引用的文件之后。您需要在 -l 标志之前移动 .o 文件。这个想法是稍后出现的文件“填充”早期文件中包含的引用 - 因为您的 .o 文件是最后一个文件,所以链接器希望它们填充 boost_system 中任何缺失的符号,而不是反之亦然。当您动态链接时,顺序无关紧要,因为它直到在运行时第一次使用符号时才解析符号(到那时它知道要在其中查找符号的库的完整列表)。

    【讨论】:

    • 天啊! 。现在效果很好。
    猜你喜欢
    • 2021-03-30
    • 2012-11-08
    • 2019-07-05
    • 2010-11-07
    • 1970-01-01
    • 2015-04-09
    • 2017-02-25
    • 2021-05-16
    相关资源
    最近更新 更多