gpt4 book ai didi

c++ - 几个使用相同原型(prototype)的共享对象导致错误 : file already exists in database

转载 作者:搜寻专家 更新时间:2023-10-31 00:10:42 31 4
gpt4 key购买 nike

一个与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 拷贝时,就会出现此问题。有两种方法可以避免这种情况:

  1. 您已经找到的方法:将 .pb.cc 文件提取到共享库中。
  2. 将 libprotobuf 的单独拷贝链接到每个插件中。您需要为此库使用静态链接,即使用 libprotobuf.a 而不是 libprotobuf.so。请注意,使用此选项时,在插件和基础应用程序之间传递指向 protobuf 类的指针是不安全的,因为它们使用的是 protobuf 库的单独拷贝,这可能会导致崩溃。您将不得不将序列化消息作为字节 blob 传递。幸运的是,这就是 protobuf 的全部意义所在。

关于c++ - 几个使用相同原型(prototype)的共享对象导致错误 : file already exists in database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37051635/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com