编译过程中关于boost静态库的链接错误“undefined reference”

Linking error "undefined reference" about boost static library during compiling

提问人:Han 提问时间:12/2/2015 最后编辑:PatrykHan 更新时间:10/9/2016 访问量:4757

问:

我正在尝试使用提升库 1.57 在 Linux x64 上编译我的 C++ 项目。

这个项目是用 scons 编译的,我在我的 Arch Linux 上成功编译了它,但这次在 Ubuntu 机器上失败了。

我添加了链接标志,但错误“未定义的引用”仍然存在。-lboost_coroutine

/usr/bin/g++ -o build/gcc.release/app -pthread -g
build/gcc.release/src/han/unity/rpcx.o 
-lpthread -lz -lboost_coroutine -lboost_context -lboost_date_time 
build/gcc.release/src/han/unity/rpcx.o: In function `attributes':
/usr/local/include/boost/coroutine/attributes.hpp:31: undefined reference 
to `boost::coroutines::stack_traits::default_size()'

我注意到 attributes.hpp 正是 boost 协程头文件之一。我尝试使用 nm 来增强协程库,但似乎没有问题。

nm /usr/local/lib/libboost_coroutine.a | grep "default_size"
0000000000000170 T _ZN5boost10coroutines12stack_traits12default_sizeEv

我搜索了此错误的可能原因,大多数都是关于链接器标志的顺序。在这种情况下,rpcx.o 依赖于 boost_coroutine,因此它出现在前面。

还有什么原因?

C++ Linux Boost Linker 未定义引用

评论

0赞 Grigorii Chudnov 12/3/2015
libboost_coroutine后尝试链接。libboost_thread
0赞 Han 12/3/2015
感谢您的评论。我试过了,但没有成功
0赞 Grigorii Chudnov 12/3/2015
如果可以通过 scons 生成它,包括详细的调试输出,则应看到用于生成应用的命令。VERBOSE=1

答:

8赞 Han 12/3/2015 #1

经过几个小时的努力,我终于解决了它。

原来是仍然存在的旧 boost (v1.55) 库,它具有与我手动安装的 boost 库 (v1.57) 同名的静态库。链接器在 v1.57 之前找到了 v1.55 静态库,因此它使用这些库进行链接。但是,在旧版本中,该函数仍然没有引入,这使得链接器无法找到该函数的正确位置,并返回“undefind reference”。boost::coroutines::stack_traits::default_size()

对于那些在编译过程中通过谷歌搜索“未定义的引用”错误而碰巧发现这个问题的人,我得到了关于调试此类问题的几个步骤,并写在这里供您参考。

  1. 检查您链接的库是否存在,或者,如果没有,请先尝试安装它们。/usr/lib//usr/local/lib/

  2. 检查是否为引用的库添加了正确的链接标志。例如,如果您使用boost_coroutine库,请务必在链接期间添加。-lboost_coroutine

  3. 检查链接标志的顺序是否正确(对于 gcc)。这可能是大多数病例的原因。如果 B 依赖于 A,请确保将 B 放在 A 的前面。

  4. 检查同一库是否存在不同的版本。

我希望这些能以某种方式有所帮助。