与 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.so
和 libprotobuf.so
。这工作正常。当然,因为在 #1062 中,错误已被修复。但是当我将 protocol.so
更改为 protocol.a
时,它再次失败。我认为它与单独编译生成的 .pb.cc
相同。
我不想编译一个 protocol.so
,因为当我添加越来越多的插件时,扩展通信协议(protocol)对我来说很不方便。我认为将生成的 .pb.cc
编译到插件的二进制文件中会更好(这在 Windows 和 OS X 上运行良好)。
任何修复此错误的建议表示赞赏。
最佳答案
当您有同一个 .pb.cc
文件的多个编译拷贝共享 libprotobuf.so
的单个拷贝时,就会出现问题。有两种方法可以避免这种情况:
.pb.cc
文件分解到共享库中。 libprotobuf.a
而不是 libprotobuf.so
。请注意,使用此选项,在插件和基本应用程序之间传递指向 protobuf 类的指针是不安全的,因为它们使用 protobuf 库的单独拷贝,这可能会导致崩溃。您必须将序列化消息作为字节 blob 传递。幸运的是,这就是 protobuf 的全部意义所在。 关于c++ - 几个共享对象使用相同的 proto 导致错误 : file already exists in database,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37051635/