编译报错: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


__EOF__

本文作者stdxxd
本文链接https://www.cnblogs.com/stdxxd/p/16491854.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   stdxxd  阅读(3905)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2021-07-18 java第19天
点击右上角即可分享
微信分享提示