2015-12-01 93 views
1

我想用boost库1.57在Linux x64上编译我的C++项目。在编译期间关于boost boost静态库的链接错误“undefined reference”

这个项目是用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,所以它出现在前面。

还有什么原因?

+0

尝试在libboost_coroutine之后链接'libboost_thread'。 –

+0

感谢您的评论。我试过但没有工作 – Han

+0

如果你可以通过scons构建它,使用'VERBOSE = 1'包含详细的调试输出,你应该看到用于构建你的应用程序的命令。 –

回答

2

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

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

对于那些在编译过程中偶然发现Google搜索“未定义引用”错误的问题,我有几个关于调试这类问题的步骤,并在这里为您提供信息。如果你链接的库中存在/usr/lib//usr/local/lib/

  1. 检查,如果没有,尝试安装这些第一。

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

  3. 检查链接标志的顺序是否正确(对于gcc)。这可能是大多数情况下的原因。如果B取决于A,请务必将B放在A的前面。

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

我希望这些可以帮助某种方式。