ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

编译报错:std::basic_string与std::__cxx11::basic_string无法匹配的问题

2022-07-18 20:31:54  阅读:139  来源: 互联网

标签:std 11 string c++ 报错 basic


问题描述:报错函数未定义,实际上函数实现在一个动态库中,反复核实.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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有