与protobuf3相关的错误
我有一个具有c ++可执行核心和几个称为插件的共享对象(.so,.dll)的项目。内核启动时,它将使用dlopen加载这些插件。内核和插件使用protobuf作为通信协议,因此它们必须将生成的文件.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
,因为当我添加越来越多的插件时,扩展通信协议对我来说很不方便。我认为将生成.pb.cc
的文件编译到插件的二进制文件中会更好(在Windows和OS X上效果很好)。
任何建议,以解决此错误,不胜感激。
当同一.pb.cc
文件的多个已编译副本共享的单个副本时,就会发生此问题libprotobuf.so
。有两种方法可以避免这种情况:
.pb.cc
文件分解到共享库中。libprotobuf.a
而不是libprotobuf.so
。请注意,使用此选项,在插件和基础应用程序之间传递指向protobuf类的指针是不安全的,因为它们使用的是protobuf库的单独副本,这可能导致崩溃。您将必须将序列化消息作为字节Blob传递。幸运的是,这就是protobuf的全部重点。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句