Tag: 协议缓冲区

链接静态C库时未定义的引用

在我的最新项目中,我遇到了一个关于对共享库方法的未定义引用的奇怪问题。 我搜索了SO,但我能找到的只是C ++相关(extern“C”)或者没有真正帮助。 有问题的库是我的libosm分支,它使用protobuf以二进制格式(.osm.pbf)为OpenStreetMap数据生成去/序列化代码。 有问题的函数是osmpbf__blob__unpack但这只是我最终使用的第一个,所以我怀疑它是一个普遍的问题。 我用nm检查了生成的libosm.a ,并且该方法在那里并导出但由于某种原因在链接时找不到它。 以下是我目前的旗帜。 我尝试更改顺序,甚至包括所有库两次(如另一个线程中所示),但我总是以未定义的引用结束。 CFLAGS = -v -std=c99 -O3 -Wall -Wextra -pedantic LIBFLAGS = -losmpbf -lprotobuf-c -lz -lpthread 目前我对错误可能很遗憾,但我认为这可能是一个小错误。 自从我使用C以来已经有一段时间..任何帮助将不胜感激。 干杯,弗洛里安 编辑:这是我完整的Makefile。 我刚刚LIBFLAGS了变量LIBFLAGS的名称,因为我使用了自己的小规则,但似乎我应该使用LDLIBS和内置规则来处理这个简单的情况。 CC = gcc CFLAGS = -v -std=c99 -O3 -Wall -Wextra -pedantic LIBFLAGS = -losmpbf -lprotobuf-c -lz -lpthread all: main.x main.x: main.c $(CC) $(CFLAGS) $(LIBFLAGS) main.c -o main.x […]

在protobuf-c中,可选的uint32变量的值为0

Message Data{ optional uint64 userid = 1; repeated string usernames = 2; optional uint32 status = 3; } 案例1 – ‘status’包含非零值’ 如果status =非零值当我使用data__pack(const Data *消息,uint8_t * out)函数打包数据时,’out’的长度为100,函数返回100(值100用作例)。 案例2 – ‘status’包含值0 如果status = 0(对于与用例1中相同的userid和username的值)当我使用data__pack()函数打包数据时,’out’的长度为99但函数仍然返回100。 如果您注意到上述两种情况,如果变量’status’使用值0,则如果’status’包含非零值,则输出缓冲区的长度始终小于长度1。 我已将has_status变量设置为1,因此这似乎不是问题。 这是一个protobuf错误还是我做错了什么? 其他细节:我使用的Protobuf版本 – protobuf-c-0.15 关于这个问题的附加细节 Data msg = DATA__INIT; void* buf = (void*) NULL; int buf_len = 0; buf_len = […]

C结构(C ++ POD)和谷歌protobufs之间的转换?

我的代码目前传递了很多(有时是嵌套的)C(或C ++ Plain Old Data)结构和数组。 我想将这些转换为谷歌protobufs。 我可以手动编写在这两种格式之间进行转换的代码,但是自动生成此类代码的错误会更少。 做这个的最好方式是什么? (对于有足够内省的语言来迭代成员变量的名称,这很容易,但这是我们所讨论的C ++代码) 我正在考虑的一件事是编写解析C结构的python代码,然后吐出一个.proto文件,以及为所有类型从成员复制到成员(在任一方向上)的C代码,但也许有一个更好的方式……或者可能有另一个已经可以生成的IDL: .h文件包含所有嵌套类型 .proto文件包含等价物 .c文件,其函数可复制.proto文件生成的C ++结构与.h文件中定义的结构之间的任一方向