Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1712919
  • 博文数量: 143
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1462
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-23 11:14
文章分类

全部博文(143)

文章存档

2022年(3)

2021年(13)

2020年(21)

2019年(8)

2018年(28)

2017年(7)

2016年(63)

我的朋友

分类: 嵌入式

2018-10-06 11:06:51

奇怪问题:使用pb_encode()时,报错:invalid data_size。
问题现象:
对pb_encode()的入参X_fields,分别在调pb_encode()前和pb_encode()中打印,发现结构体X_fields的有些成员变量的值,前后不一或有点交换错位。然而X_fields的定义是在x.pb.c中定义,且x.pb.c是protoc工具自动生成的;X_fields的类型pb_field_t是在pb.h中定义,pb_field_t中成员的类型也全在pb.h中定义,且pb.h是gpb提供的库头文件。

点击(此处)折叠或打开

  1. Nov 10 19:15:44 sksstats[7270]: <DEBUG> [ReportHandle:1282] WHJ_DEBUG:pb_field_s 1 17 0 0 4 0
  2. Nov 10 19:15:44 sksstats[7270]: <DEBUG> [pb_encode:464] whj_debug:pb_field_s 1 0 17 0 0 0
  3. Nov 10 19:15:44 sksstats[7270]: <DEBUG> [pb_encode:479] whj_debug:
  4. Nov 10 19:15:44 sksstats[7270]: <DEBUG> [encode_field:388] whj_debug:PB_ATYPE_STATIC and
  5. Nov 10 19:15:44 sksstats[7270]: <DEBUG> [encode_basic_field:282] whj_debug:field type:0 PB_LTYPE:0
  6. Nov 10 19:15:44 sksstats[7270]: <DEBUG> [encode_basic_field:313] whj_debug:PB_HTYPE_REQUIRED
  7. Nov 10 19:15:44 sksstats[7270]: <DEBUG> [pb_enc_varint:670] whj_debug:varint 0
  8. Nov 10 19:15:44 sksstats[7270]: <ERROR> [ReportHandle:1286] erro:invalid data_size

那么,因为我是先编的libgpb.so,再把其链接到a.out中。所以,我又检查二者链接的pb.h是不是同一个。是同一个。

然后,既然是X_fields成员的值有错位,进一步检查X_fields成员的类型,发现类型的实际类型由2个宏控制:PB_FIELD_32BITPB_FIELD_16BIT。那么,检查了编译libgpb.soa.outMakefile,发现a.outMakefile带了-DPB_FIELD_16BIT,而libgpb.soMakefile没有该宏定义。

解决方法:
在libgpb.so的Makefile增加编译选项-DPB_FIELD_16BIT
其实,在gpb包nanopb中的readme已经明确了使用方法:(直接一起编,不用分开编再链

阅读(5475) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~