我正在尝试使用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()'
我注意到attributes.hpp正好是一个boost协程头文件。我尝试使用nm来增强协程库,这似乎没什么问题。
nm /usr/local/lib/libboost_coroutine.a | grep "default_size"
0000000000000170 T _ZN5boost10coroutines12stack_traits12default_sizeEv
我搜索了此错误的可能原因,大多数是关于链接器标志的顺序。在这种情况下,rpcx.o依赖于boost_coroutine,因此它出现在前面。
还有什么原因?
答案 0 :(得分:4)
经过几个小时的努力,我终于解决了它。
原来是旧的boost(v1.55)lib仍然存在,它具有与我手动安装的boost库(v1.57)同名的静态库。链接器在v1.57之前找到v1.55静态库,因此它使用这些库进行链接。但是,在旧版本中,仍未引入函数boost::coroutines::stack_traits::default_size()
,这使得链接器无法找到此函数的正确位置,并返回"取消引用"。
对于那些碰巧通过谷歌搜索找到这些问题的人,未定义的参考文献"编译过程中的错误,我有几个步骤来调试这类问题,并写在这里为您提供信息。
检查您链接的库是否存在/usr/lib/
或/usr/local/lib/
,如果没有,请尝试先安装这些库。
检查是否为引用的库添加了正确的链接标志。例如,如果您使用boost_coroutine libs,请确保在链接期间添加-lboost_coroutine
。
检查链接标志的顺序是否正确(对于gcc)。这可能是大多数情况的原因。如果B取决于A,请务必将B放在A前面。
检查相同的库是否存在不同的版本。
我希望这些可能会有所帮助。