Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Protobuf和Node.JS库错误_Node.js_Protocol Buffers - Fatal编程技术网

Protobuf和Node.JS库错误

Protobuf和Node.JS库错误,node.js,protocol-buffers,Node.js,Protocol Buffers,我正在Ubuntu 14.04 LTS上使用Node.JS的google协议缓冲区。我有两个不同的(A和B)Node.JS插件(c++),它们使用相同的协议缓冲区和protobuf库。在模块a之前是必需的之后,我使用require()创建模块B的新实例时,服务器停止运行,并显示错误消息: [libprotobuf ERROR google/protobuf/descriptor_database.cc:57] File already exists in database: Anam.proto

我正在Ubuntu 14.04 LTS上使用Node.JS的google协议缓冲区。我有两个不同的(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"]

如果我为同一个模块创建了更多实例(例如,需要两次addon A),它就可以工作。有人有任何建议来解决这个问题吗?< /P> < P>问题可能是这两个C++模块都包含了相同的<>代码> PROTO TO /Cult>文件的单独编译副本,但它们共享了LIbToBuffF.的相同副本。每一个都试图将其protobuf描述符类型注册到全局类型描述符表中,然后就会出现冲突

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

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

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

    谢谢您的回答!针对libprotobuf的静态链接解决了这个问题(我将.a文件而不是.so文件链接为:“libraries”:[“/usr/local/lib/libprotobuf.a”,…])。我总是用序列化消息进行通信,所以它工作得很好。