与 protobuf3 相关的错误

我有一个项目,它有一个 C++ 可执行核心和几个称为插件的共享对象(.so、.dll)。当核心启动时,它将使用 dlopen 加载这些插件。核心和插件使用 protobuf 作为通信协议(protocol),因此他们必须将生成的 .pb.cc.ph.h 文件编译成他们的二进制文件,以获得序列化器/反序列化器的拷贝。 libprotobuf.so 链接到核心和插件。当我启动核心时,它崩溃并显示错误:文件已存在于数据库中,#863 中出现相同错误

我正在使用 protobuf-3 beta2 和 Ubuntu 14.04。此错误仅发生在 Linux 上。该程序在 Windows 和 OS X 上运行良好。

我还尝试了另一种方法,将所有生成的 protobuf 文件编译成动态库( protocol.so ),然后将核心和插件链接到 protocol.solibprotobuf.so 。这工作正常。当然,因为在 #1062 中,错误已被修复。但是当我将 protocol.so 更改为 protocol.a 时,它​​再次失败。我认为它与单独编译生成的 .pb.cc 相同。

我不想编译一个 protocol.so ,因为当我添加越来越多的插件时,扩展通信协议(protocol)对我来说很不方便。我认为将生成的 .pb.cc 编译到插件的二进制文件中会更好(这在 Windows 和 OS X 上运行良好)。

任何修复此错误的建议表示赞赏。

最佳答案

当您有同一个 .pb.cc 文件的多个编译拷贝共享 libprotobuf.so 的单个拷贝时,就会出现问题。有两种方法可以避免这种情况:

  • 您已经找到的方法:将 .pb.cc 文件分解到共享库中。
  • 将 libprotobuf 的单独拷贝链接到每个插件中。您需要为此库使用静态链接,即使用 libprotobuf.a 而不是 libprotobuf.so 。请注意,使用此选项,在插件和基本应用程序之间传递指向 protobuf 类的指针是不安全的,因为它们使用 protobuf 库的单独拷贝,这可能会导致崩溃。您必须将序列化消息作为字节 blob 传递。幸运的是,这就是 protobuf 的全部意义所在。
  • 关于c++ - 几个共享对象使用相同的 proto 导致错误 : file already exists in database,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37051635/

    10-11 20:14
    查看更多