与protobuf3相关的错误
我有一个项目,它有一个 C++ 可执行核心和几个称为插件的共享对象(.so、.dll)。当核心启动时,它将使用 dlopen 加载这些插件。核心和插件使用protobuf作为通信协议,因此它们必须编译生成的.pb.cc
and .ph.h
文件写入其二进制文件以获得序列化器/反序列化器的副本。和libprotobuf.so
链接到核心和插件。当我启动核心时,它崩溃并出现错误:文件已存在于数据库中,同样的错误#863 https://github.com/google/protobuf/issues/863
我正在使用 protobuf-3 beta2 和 Ubuntu 14.04。此错误仅发生在 Linux 上。该程序在 Windows 和 OS X 上运行良好。
我还尝试了另一种方法,将所有生成的 protobuf 文件编译到动态库中(protocol.so
),然后核心和插件被链接到protocol.so
and libprotobuf.so
。这很好用。当然,因为在#1062 https://github.com/google/protobuf/pull/1062该错误已被修复。但是当我改变了protocol.so
into protocol.a
,又失败了。我认为它与编译生成相同.pb.cc
分别地。
我不想编译一个protocol.so
,因为当我添加越来越多的插件时,扩展通信协议很不方便。我认为编译生成的.pb.cc
进入插件的二进制文件更好(这在 Windows 和 OS X 上运行良好)。
任何修复此错误的建议都值得赞赏。
当您有相同内容的多个编译副本时,就会出现问题.pb.cc
文件共享单个副本libprotobuf.so
。有两种方法可以避免这种情况:
- 你已经找到的方法:分解出
.pb.cc
文件到共享库中。
- 将 libprotobuf 的单独副本链接到每个插件中。您需要为此库使用静态链接,即使用
libprotobuf.a
而不是libprotobuf.so
。请注意,使用此选项时,在插件和基础应用程序之间传递指向 protobuf 类的指针是不安全的,因为它们使用 protobuf 库的单独副本,这可能会导致崩溃。您必须将序列化消息作为字节 blob 传递。幸运的是,这就是 protobuf 的全部意义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)