首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Protobuf和Node.JS库错误

Protobuf和Node.JS库错误
EN

Stack Overflow用户
提问于 2016-02-07 04:51:43
回答 1查看 343关注 0票数 0

我在Ubuntu14.04LTS上使用谷歌协议缓冲区和Node.JS。我有两个不同的(A和B) Node.JS插件(c++),使用相同的协议缓冲区和protobuf库。当我使用required ()创建模块B的新实例时,服务器停止并显示错误消息:

代码语言:javascript
复制
[libprotobuf ERROR google/protobuf/descriptor_database.cc:57] File already exists in database: Anam.proto 
[libprotobuf FATAL google/protobuf/descriptor.cc:1157] CHECK failed: generated_database_->Add(encoded_file_descriptor, size):  terminate called after throwing an instance of 'google::protobuf::FatalException'
what():  CHECK failed: generated_database_->Add(encoded_file_descriptor, size)

我在谷歌上搜索了这个错误,发现其他人只在Linux上遇到过这个错误。我还安装了来自github的protobuf库的最新版本,但它没有帮助。binding.gyp中包含libprotobuf的部分如下所示:

代码语言:javascript
复制
"libraries": ["/usr/lib/libpq.so",
              "/usr/local/lib/libprotobuf.so",
              "/usr/local/lib/libboost_system.so",
              "/usr/local/lib/libboost_thread.so",
              "/usr/local/lib/libboost_signals.so"]

如果我创建同一模块的更多实例(例如,需要添加A 2次),它就可以工作。有谁有任何建议如何解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2016-02-09 02:16:58

问题可能是这两个C++模块包含相同.proto文件的单独编译副本,但它们共享相同的libprotobuf.so副本。每一个都试图在全局类型描述符表中注册它的协议one描述符类型,然后就会看到冲突。

有两种方法可以纠正该问题:

  1. 将共享的.proto文件移动到一个共享库中,两个模块都链接到这个库中(这样它们最终会共享编译后的protos的一个副本)。
  2. 使每个模块都静态地链接到libprotobuf,这样它们就不会共享libprotobuf。这样每一个都会得到它自己的描述符表。请注意,如果一个模块接收到另一个模块创建的protobuf对象(如果它们只交换序列化的消息,而不交换对象,这很好),这种方法将不起作用。

请注意,此问题影响所有平台,但人们可能在Windows上看不到它,因为静态链接libprotobuf在Windows上更常见。

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

https://stackoverflow.com/questions/35246322

复制
相关文章

相似问题

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