我在Ubuntu14.04LTS上使用谷歌协议缓冲区和Node.JS。我有两个不同的(A和B) Node.JS插件(c++),使用相同的协议缓冲区和protobuf库。当我使用required ()创建模块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次),它就可以工作。有谁有任何建议如何解决这个问题吗?
发布于 2016-02-09 02:16:58
问题可能是这两个C++模块包含相同.proto文件的单独编译副本,但它们共享相同的libprotobuf.so副本。每一个都试图在全局类型描述符表中注册它的协议one描述符类型,然后就会看到冲突。
有两种方法可以纠正该问题:
.proto文件移动到一个共享库中,两个模块都链接到这个库中(这样它们最终会共享编译后的protos的一个副本)。请注意,此问题影响所有平台,但人们可能在Windows上看不到它,因为静态链接libprotobuf在Windows上更常见。
https://stackoverflow.com/questions/35246322
复制相似问题