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