首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >几个使用相同proto的共享对象导致错误:文件已经存在于数据库中

几个使用相同proto的共享对象导致错误:文件已经存在于数据库中
EN

Stack Overflow用户
提问于 2016-05-05 13:15:38
回答 4查看 8.9K关注 0票数 3

与protobuf3相关的错误

我有一个项目,它有一个c++可执行核心和几个共享对象(.so,.dll),称为插件。当内核启动时,它将用dlopen加载这些插件。核心和插件使用protobuf作为通信协议,因此必须将生成的.pb.cc.ph.h文件编译到二进制文件中,才能获得序列化程序/反序列化器的副本。和libprotobuf.so链接到核心和插件。当我启动内核时,它会出现错误:数据库中已经存在文件,#863中也存在相同的错误

我使用的是protobuf-3 beta2和Ubuntu14.04。此错误仅发生在Linux上。该程序在Windows和OS上运行良好。

我还尝试了另一种方法,将所有生成的protobuf文件编译到一个动态库(protocol.so)中,然后将核心和插件链接到protocol.solibprotobuf.so。这个很好用。当然,因为在#1062中,bug已经修复。但是当我将protocol.so改为protocol.a时,它又失败了。我认为这与单独编译生成的.pb.cc是一样的。

我不想编译protocol.so,因为当我添加越来越多的插件时,扩展通信协议对我来说是不方便的。我认为将生成的.pb.cc编译成插件的二进制更好(这在windows和OS上很好)。

如有任何修正此错误的建议,敬请见谅。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-05-05 17:07:52

当同一个.pb.cc文件的多个编译副本共享一个libprotobuf.so副本时,就会发生此问题。有两种方法可以避免这种情况:

  1. 您已经找到的方式:将.pb.cc文件分解到共享库中。
  2. 链接到每个插件中的libprotobuf的单独副本。您需要对这个库使用静态链接,即使用libprotobuf.a而不是libprotobuf.so。请注意,使用此选项,在插件和基本应用程序之间传递指向protobuf类的指针是不安全的,因为它们使用的是protobuf库的单独副本,这可能导致崩溃。您必须以字节块的形式传递序列化的消息。幸运的是,这就是原型的意义所在。
票数 6
EN

Stack Overflow用户

发布于 2018-09-25 09:19:51

我能够通过在dlopen中添加RTLD_GLOBAL来解决这个问题,其中考虑到了现有的已知符号。

票数 1
EN

Stack Overflow用户

发布于 2021-06-22 10:12:53

我通过在dlopen中添加RTLD_DEEPBIND来解决这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37051635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档