编译期间关于 boost 静态库的链接错误 "undefined reference"
Linking error "undefined reference" about boost static library during compiling
我正在尝试使用 boost 库 1.57 在 Linux x64 上编译我的 C++ 项目。
这个项目是用 scons 编译的,我在我的 Arch Linux 上成功编译了它,但是这次在 Ubuntu 机器上失败了。
我为链接添加了 -lboost_coroutine
标志,但错误 "undefined reference" 仍然存在。
/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,所以它出现在前面。
还有什么可能的原因?
经过几个小时的努力,终于解决了
原来是旧的boost (v1.55) 库仍然存在,它有与我手动安装的boost 库(v1.57) 同名的静态库。链接器在 v1.57 之前找到了 v1.55 静态库,因此它使用这些库进行链接。但是在老版本中,函数boost::coroutines::stack_traits::default_size()
仍然没有被引入,这使得链接器无法找到这个函数的正确位置,而returns "undefind reference".
对于那些碰巧在编译过程中通过谷歌搜索 "undefined reference" 错误发现这个问题的人,我得到了调试此类问题的几个步骤并写在这里以供参考。
检查您链接的库是否存在于/usr/lib/
或/usr/local/lib/
中,如果不存在,请先尝试安装它们。
检查您是否为引用的库添加了正确的链接标志。例如,如果您使用 boost_coroutine 库,请务必在链接期间添加 -lboost_coroutine
。
检查链接标志的顺序是否正确(对于 gcc)。这可能是大多数情况的原因。如果 B 依赖于 A,请确保将 B 放在 A 之前。
检查相同库是否存在不同版本。
我希望这些能有所帮助。
我正在尝试使用 boost 库 1.57 在 Linux x64 上编译我的 C++ 项目。
这个项目是用 scons 编译的,我在我的 Arch Linux 上成功编译了它,但是这次在 Ubuntu 机器上失败了。
我为链接添加了 -lboost_coroutine
标志,但错误 "undefined reference" 仍然存在。
/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,所以它出现在前面。
还有什么可能的原因?
经过几个小时的努力,终于解决了
原来是旧的boost (v1.55) 库仍然存在,它有与我手动安装的boost 库(v1.57) 同名的静态库。链接器在 v1.57 之前找到了 v1.55 静态库,因此它使用这些库进行链接。但是在老版本中,函数boost::coroutines::stack_traits::default_size()
仍然没有被引入,这使得链接器无法找到这个函数的正确位置,而returns "undefind reference".
对于那些碰巧在编译过程中通过谷歌搜索 "undefined reference" 错误发现这个问题的人,我得到了调试此类问题的几个步骤并写在这里以供参考。
检查您链接的库是否存在于
/usr/lib/
或/usr/local/lib/
中,如果不存在,请先尝试安装它们。检查您是否为引用的库添加了正确的链接标志。例如,如果您使用 boost_coroutine 库,请务必在链接期间添加
-lboost_coroutine
。检查链接标志的顺序是否正确(对于 gcc)。这可能是大多数情况的原因。如果 B 依赖于 A,请确保将 B 放在 A 之前。
检查相同库是否存在不同版本。
我希望这些能有所帮助。