Protobuf和Node.JS库错误

时间:2016-02-06 20:51:43

标签: node.js protocol-buffers

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

[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,如下所示:

"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次),它就可以工作。有没有人有任何建议如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

有两种方法可以解决问题:

  1. 将共享的.proto文件移动到两个模块链接的共享库中(以便它们最终共享一个已编译的原型的副本)。
  2. 使每个模块与libprotobuf静态链接,以便他们共享libprotobuf。这样每个都将获得自己的描述符表。请注意,如果一个模块接收到另一个模块创建的protobuf对象(如果它们只交换序列化消息,而不是对象,那就没问题),这种方法不会起作用。
  3. 请注意,此问题会影响所有平台,但人们可能无法在Windows上看到它,因为静态链接libprotobuf在那里更常见。