博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】protobuf2.5.0在<delete [] elements_;>crash的问题。
阅读量:6622 次
发布时间:2019-06-25

本文共 1684 字,大约阅读时间需要 5 分钟。

背景

项目中使用protobuf作为网络传输协议,最开始在项目中直接使用源代码编译,在真机上测试一直是正常的,直到某天开始在 CPU是64 bit的设备上发现protobuf导致crash了,于是就开始尝试使用.a静态库看看是否能解决问题(失败了)。bug解决方案直接看最后。

     开发环境

  • OS X 10.9 Mavericks
  • Xcode 5.0.2
  • protobuf 2.5.0
  • IOS7

     Crash现象

protobuf在静态初始化的时候,crash在一个delete[] XXXptr; 这个指针是一个NULL。非常奇怪在32bit的ios设备上同样也是执行到这里也是delete[] nullptr就没有问题。简单搜索了一下,没有什么收获,遂暂时放弃直接解决这个问题。

[cpp]
  1. template <typename TypeHandler>  
  2. void RepeatedPtrFieldBase::Destroy() {  
  3.   for (int i = 0; i < allocated_size_; i++) {  
  4.     TypeHandler::Delete(cast<TypeHandler>(elements_[i]));  
  5.   }  
  6.   delete [] elements_;  // elements_ == NULL  
  7. }  

尝试编译.a

略过大堆因为Xcode升级而无效/需修改的方法,直接上目前找到最靠谱的一个全自动脚本:

这个脚本实现了:

  • 下载protobuf 2.5.0源代码
  • 生产5个平台的静态库(mac 64, iPhone simulator, armv7, armv7s, arm 64)
  • 合并成一个完整的Universal静态库。

编译是成功的,可能对于大部分人来说,到这里就结束了。

但是。。。在将生成的.a加入工程中依然出现了std库找不到的link错误。

静态库编辑成功

调整了除mac64平台外的CXX编译参数,和项目中使用的参数匹配之后,终于成功了。

最终使用的参数如下,(mac64的保持不变)

    • CXX=clang++
    • CXXFLAGS_ARM="${CFLAGS} -stdlib=libstdc++"
    • LDFLAGS_ARM="-stdlib=libstdc++"

但是。。。在64bit设备上依然Crash,现象同上。可以宣布这个尝试方向失败了!

问题解决

很意外的发现,crash的地方是Libproto.dylib,这个库是Apple自带的,而项目中是没有使用到这个库的。Google了一 下:“ImageLoader on the newer devices (iPhone 5S and apparently iPad air) has its own copy of Protocol Buffers which causes symbol collisions.",也就是说在最新的3个设备上有个库自带了一个Protobuf,和项目中的protobuf的namespace是一样的,这 样就就产生了冲突。
办法就很简单了:
  1. 使用protobuf源代码(正好这项目原来就使用源代码)
  2. 修改google\protobuf\stubs\common.h,加入一行宏定义,修改本地的命名空间
[cpp]
  1. namespace std {}  
  2.   
  3. #define google google_private  
  4.   
  5. namespace google {  
  6. namespace protobuf {  

相关信息

Xcode 5.0.2的一些默认参数

  • C Language Dialect:GUN99(-std=gnu99)
  • C++ Language Dialect:GNU++98(-std=gnu++98)
  • C++ Standard Library:libstdc++(-stdlib=libstdc++)

StackOverflow上的回答:

转载于:https://www.cnblogs.com/Androider123/p/3951279.html

你可能感兴趣的文章
解决MySQL Workbench导出乱码问题
查看>>
一些工作实践中的css样式使用
查看>>
半年“攻下”两城,Drive.ai自动驾驶运营之路如何走? | 2018全球智能驾驶峰会...
查看>>
IntelliJ IDEA隐藏文件或文件夹
查看>>
Confluence 6 Microsoft SQL Server 设置准备
查看>>
Hibernate @OneToOne 自动新增和删除
查看>>
小程序 — 选项卡
查看>>
vsts + XX云服务器构建netcore+docker持续集成交付部署
查看>>
史上最贵的国产手机华为 Mate20 系列发布,价格最高超过 15000
查看>>
车好多完成1.62亿美元C+轮融资,获30亿元毛豆总部基地资金支持
查看>>
IIS7浏览虚拟目录显示根目录文件
查看>>
深入调研Linq to Objects Join Linq to Entity
查看>>
Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制
查看>>
一起探讨 JavaScript 的对象
查看>>
美团供应链系统架构简介及演进历程 | UPYUN Open Talk NO.3
查看>>
HttpClient接口测试中的使用
查看>>
秋后的暖
查看>>
优雅地调用接口--手把手带你从0到1实现retrofit框架
查看>>
springboot使用MultipartFile
查看>>
Android绘制(一):来用shape绘出想要的图形吧!
查看>>