链接错误“未定义的参考”在编译期间关于boost静态库

我想用boost库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()' 

我注意到属性.hpp恰好是boost协程头文件之一。 我试图用nm来提升协程库,似乎没有问题。

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

我search了这个错误的可能原因,大部分是关于链接器标志的顺序。 在这种情况下,rpcx.o取决于boost_coroutine,所以这出现在前面。

还有什么可能的原因?

Solutions Collecting From Web of "链接错误“未定义的参考”在编译期间关于boost静态库"

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

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

对于那些在编译过程中偶然发现“未定义引用”错误的人来说,我有几个步骤来调试这个问题,并在这里写下了你的信息。

  1. 检查链接的库是否存在于/usr/lib//usr/local/lib/ ,如果不存在,请尝试先安装这些库。

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

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

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

我希望这些可以帮助。