gcc 4.8.4编译链接后的可执行文件在gcc5.4.0出现symbol lookup error

1.背景

在其中一台linux机器上进行代码的编译链接最终生成可执行文件。

编译的过程中有.a和.so共享文件,对于.a的由于代码融入到了可执行代码中,因此不需要在新linux机器上再继续安装第三方依赖库了。

而.so文件则需要进行对应版本的安装。而生成可执行文件的gcc为4.8.4

后面将可执行文件拷贝到另一台linux机器上,然后安装需要的第三方依赖库,这里需要的boost1.55。

这台机器的gcc为5.4.0

当一切安装好后,执行程序,却出现了symbol lookup error错误,显示_ZN5boost13match_resultsIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS5_EEEE12maybe_assignERKS9_没有找到


2.查询问题

2.1 通过指令ldd -r 查询还有哪些符号没有找到的,发现不只一个

undefined symbol: _ZN5boost13match_resultsIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS5_EEEE12maybe_assignERKS9_	(./)
undefined symbol: _ZN6apache6thrift5async25TConcurrentClientSyncInfo10getPendingERSsRNS0_8protocol12TMessageTypeERi	(./)
undefined symbol: _ZN5boost9re_detail12perl_matcherIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS6_EEENS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE14construct_initERKNS_11basic_regexIcSD_EENS_15regex_constants12_match_flagsE	(./)
undefined symbol: _ZN6apache6thrift5async25TConcurrentClientSyncInfo13updatePendingERKSsNS0_8protocol12TMessageTypeEi	(./)

2.2 回查gcc4.8.4的机器上的_ZN5boost13match_resultsIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS5_EEEE12maybe_assignERKS9_所在的库文件

nm -A /usr/lib/libboost_* 2>/dev/null | grep _ZN5boost13match_resultsIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS5_EEEE12maybe_assignERKS9_
/usr/lib/libboost_graph.a:read_graphviz_new.o:                 U _ZN5boost13match_resultsIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS5_EEEE12maybe_assignERKS9_
/usr/lib/libboost_graph.so:                 U _ZN5boost13match_resultsIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS5_EEEE12maybe_assignERKS9_
/usr/lib/libboost_graph.so.1.55.0:                 U _ZN5boost13match_resultsIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS5_EEEE12maybe_assignERKS9_
/usr/lib/libboost_regex.a:cregex.o:                 U _ZN5boost13match_resultsIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS5_EEEE12maybe_assignERKS9_
/usr/lib/libboost_regex.a:instances.o:0000000000000000 W _ZN5boost13match_resultsIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS5_EEEE12maybe_assignERKS9_
/usr/lib/libboost_regex.so:0000000000068c40 W _ZN5boost13match_resultsIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS5_EEEE12maybe_assignERKS9_
/usr/lib/libboost_regex.so.1.55.0:0000000000068c40 W _ZN5boost13match_resultsIN9__gnu_cxx17__normal_iteratorIPKcSsEESaINS_9sub_matchIS5_EEEE12maybe_assignERKS9_
返现gcc4.8.4旧机器是有这个方法的,那么在gcc5.4.0机器上是怎样的呢,通过下面执行查询:
nm -A ~/usr/lib/libboost_* 2>/dev/null | grep libboost_regex.so | grep maybe_assign
usr/lib/libboost_regex.so:000000000009d4d0 W _ZN5boost13match_resultsIN9__gnu_cxx17__normal_iteratorIPKcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaINS_9sub_matchISB_EEEE12maybe_assignERKSF_
通过c++filt可以对比发现:

gcc4.8.4
boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >::maybe_assign(boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > const&)
gcc5.4.0:
boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >::maybe_assign(boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > const&)
可以发现其主要差异是在std::basic_string和std::__cxx11::basic_string中,通过查询相关文章,这是gcc5后使用的是std::__cxx11::basic_string

文章链接:http://stackoverflow.com/questions/33394934/converting-std-cxx11string-to-stdstring



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值