我在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次),它就可以工作。有没有人有任何建议如何解决这个问题?
答案 0 :(得分:0)
问题可能是这两个C ++模块都包含相同.proto
个文件的单独编译副本,但是共享libprotobuf.so的相同副本。每个人都试图用全局类型描述符表注册它的protobuf描述符类型,然后看到冲突。
有两种方法可以解决问题:
.proto
文件移动到两个模块链接的共享库中(以便它们最终共享一个已编译的原型的副本)。请注意,此问题会影响所有平台,但人们可能无法在Windows上看到它,因为静态链接libprotobuf在那里更常见。