奇怪问题:使用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提供的库头文件。
-
Nov 10 19:15:44 sksstats[7270]: <DEBUG> [ReportHandle:1282] WHJ_DEBUG:pb_field_s 1 17 0 0 4 0
-
Nov 10 19:15:44 sksstats[7270]: <DEBUG> [pb_encode:464] whj_debug:pb_field_s 1 0 17 0 0 0
-
Nov 10 19:15:44 sksstats[7270]: <DEBUG> [pb_encode:479] whj_debug:
-
Nov 10 19:15:44 sksstats[7270]: <DEBUG> [encode_field:388] whj_debug:PB_ATYPE_STATIC and
-
Nov 10 19:15:44 sksstats[7270]: <DEBUG> [encode_basic_field:282] whj_debug:field type:0 PB_LTYPE:0
-
Nov 10 19:15:44 sksstats[7270]: <DEBUG> [encode_basic_field:313] whj_debug:PB_HTYPE_REQUIRED
-
Nov 10 19:15:44 sksstats[7270]: <DEBUG> [pb_enc_varint:670] whj_debug:varint 0
-
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_32BIT和PB_FIELD_16BIT。那么,检查了编译libgpb.so和a.out的Makefile,发现a.out的Makefile带了-DPB_FIELD_16BIT,而libgpb.so的Makefile没有该宏定义。
解决方法:
在libgpb.so的Makefile增加编译选项-DPB_FIELD_16BIT
其实,在gpb包nanopb中的readme已经明确了使用方法:(
直接一起编,不用分开编再链)
阅读(5590) | 评论(0) | 转发(0) |