与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.so和libprotobuf.so。这个很好用。当然,因为在#1062中,bug已经修复。但是当我将protocol.so改为protocol.a时,它又失败了。我认为这与单独编译生成的.pb.cc是一样的。
我不想编译protocol.so,因为当我添加越来越多的插件时,扩展通信协议对我来说是不方便的。我认为将生成的.pb.cc编译成插件的二进制更好(这在windows和OS上很好)。
如有任何修正此错误的建议,敬请见谅。
发布于 2016-05-05 17:07:52
当同一个.pb.cc文件的多个编译副本共享一个libprotobuf.so副本时,就会发生此问题。有两种方法可以避免这种情况:
.pb.cc文件分解到共享库中。libprotobuf.a而不是libprotobuf.so。请注意,使用此选项,在插件和基本应用程序之间传递指向protobuf类的指针是不安全的,因为它们使用的是protobuf库的单独副本,这可能导致崩溃。您必须以字节块的形式传递序列化的消息。幸运的是,这就是原型的意义所在。发布于 2018-09-25 09:19:51
我能够通过在dlopen中添加RTLD_GLOBAL来解决这个问题,其中考虑到了现有的已知符号。
发布于 2021-06-22 10:12:53
我通过在dlopen中添加RTLD_DEEPBIND来解决这个问题。
https://stackoverflow.com/questions/37051635
复制相似问题