编译报错:std::basic_string与std::__cxx11::basic_string无法匹配的问题
作者:互联网
问题描述:报错函数未定义,实际上函数实现在一个动态库中,反复核实.pro文件写的没问题
查找原因:
1.查看动态库中有没有此函数
strings libfasterRCNN.so | grep init #init为报错的函数名
_ZN12TensorRT_SDK4initESsi #找到相关的信息
2.c++编译后会修改函数签名,用c++filt命令恢复
c++filt _ZN12TensorRT_SDK4initESsi
TensorRT_SDK::init(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)
3.与报错信息对比后发现是std::__cxx11::basic_string与std::basic_string没有匹配上
GCC 5在编译时会将std::string类型按c++11下std::__cxx11::basic_string<char> 来处理,这时如果你调用的库在编译时未启用c++11特性则其中的std::string实际上是std::basic_string<char> ,如果将c++11下的string当作参数传入非c++11的库时,就会出现error: cannot convert 'const std::__cxx11::basic_string<char>' to 'const char*',或者未定义的方法引用(undefined reference)。
参考链接:https://blog.csdn.net/ufolr/article/details/52669333
解决:
因为我使用了不含c++11特性的库,因此编译我的代码时也应关闭c++11特性。定义宏_GLIBCXX_USE_CXX11_ABI为0即可。
在.pro文件中添加
DEFINES += _GLIBCXX_USE_CXX11_ABI=0
或者,在代码中定义宏:
#define _GLIBCXX_USE_CXX11_ABI 0 #对我来说能用,但出现了很多redefine的警告
————————————————
版权声明:本文为CSDN博主「来人间办点私事」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/n_o_n/article/details/99336919
搜索
复制
标签:std,11,string,c++,报错,basic 来源: https://www.cnblogs.com/stdxxd/p/16491854.html