加载链接boost线程库的共享库时出现未定义符号错误,符号名存在差异,原因是什么?
碰到这种符号名只差一个字母的不匹配问题,大概率是头文件与库文件的版本/编译配置不匹配导致的,具体可能的原因有这些:
头文件与库文件的版本不一致
你编译程序时引用的Boost头文件里,sleep_for函数是放在boost::this_thread::hidden命名空间下的(正确拼写),但你链接的这个库文件,是从一个存在拼写错误的Boost版本(比如某个临时开发分支,把hidden写错成hiden)编译出来的。反过来也有可能:库是正确版本,而你用的头文件是带拼写错误的旧版本。编译时的宏定义或配置差异
Boost线程库的符号生成会受编译宏影响,比如BOOST_THREAD_VERSION、BOOST_THREAD_USES_CHRONO这类宏,或者是否开启了某些隐藏符号的编译选项。如果编译库的时候定义了某个特殊宏,导致内部命名空间被改成了hiden,而你编译自己程序的时候没加这个宏,就会出现符号名不匹配的情况。库文件是被修改过的定制版本
这个库可能不是官方发布的标准版本,而是有人手动修改过Boost源码(比如不小心把hidden拼写错成hiden)之后编译出来的。这种情况在非官方编译的第三方库中偶尔会碰到。编译器或C++标准的细微差异
虽然你用的都是gcc48,但如果编译库和编译程序时使用的C++标准版本不同(比如库用-std=c++98,程序用-std=c++11),也可能导致符号修饰出现意外变化,不过这个原因在你这个案例里优先级较低,毕竟核心差异是拼写错误。
给你几个排查方向:
- 打开你编译程序用的Boost头文件(比如
boost/thread/thread.hpp或者相关内部头文件),搜索sleep_for,看看它所在的命名空间到底是hidden还是hiden。 - 确认你链接的库文件对应的Boost版本,和你编译程序时依赖的头文件版本完全一致。
- 检查编译库和编译程序时的编译选项、宏定义是否一致,尤其是和Boost线程相关的宏。
- 如果是自己编译的Boost库,去Boost源码里搜索
hiden,看看是不是有拼写错误的代码。
内容的提问来源于stack exchange,提问作者EngMe
相关产品推荐
相关产品推荐

