首页 > 解决方案 > Protobuf 动态和静态库

问题描述

我有两个自定义的 protobuf 库。一个是动态的,另一个是静态的。静态库有一条消息:

message DataType
{
    int number = 1;
    string name_1 = 2;
    string name_2 = 3;
    string name_3 = 4;
}

// The dynamic lib has a message:
message MyMessage
{
    DataType type = 1;
}

我通过将静态原型库链接到它来构建动态原型库。然后我构建 exe 应用程序,并将动态 proto 库链接到该应用程序。

问题是当我设置 name_1、name_2 或 name_3 之一时,它们都有这个值。我认为所有这些字符串都有相同的缓冲区。如果将动态库转换为静态库,那么问题就消失了。谁能解释一下它有什么问题?谢谢你。

标签: c++protocol-buffers

解决方案


如果未设置字段,则应返回空字符串。请在此处查看文档。

如果您使用的是版本 2,您可以查询该字段是否由has_name_x().

顺便说一下,有几种方法可以设置一个值:

  • 最简单的创建一个副本:void set_name_x(const string& value)
  • 如果C++11您可以移动字符串值:void set_name_x(string&& value)
  • 您可以传递指针:void set_allocated_name_x(string* value)
  • 您可以获得指向存储字符串的指针:string* mutable_name_x()

我建议熟悉 protobuf 并让它管理内存和使用set_name_x. 如果还不够,您可以通过手动内存管理来优化您的代码。


推荐阅读