[libprotobuf ERROR google/protobuf/descriptor_database.cc:57] File already exists in database: google/protobuf/descriptor.proto [libprotobuf FATAL google/protobuf/descriptor.cc:1018] 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): Aborted (core dumped
尝试了很多方法,不知道该如何解决上面这个问题,好像是因为动态存储的问题
这个错误通常是由加载多个不同版本的 Protobuf 库或重复加载同一版本的 Protobuf 库引起的。当 Protobuf 库尝试注册同一个文件描述符(如 google/protobuf/descriptor.proto)多次时,就会发生这个错误。
google/protobuf/descriptor.proto
以下是一些解决此问题的方法:
确保你的项目中所有依赖项使用的 Protobuf 版本是一致的。不同版本之间的冲突是常见的原因之一。
如果你在使用动态库(如 .so 文件),确保在运行时没有重复加载多个版本的 Protobuf 动态库。
.so
LD_LIBRARY_PATH
确保 Protobuf 库只初始化一次。如果在多个地方初始化 Protobuf,可能会导致文件描述符重复注册。
有时,构建过程中的缓存或临时文件可能会导致问题。尝试清理和重新构建你的项目。
sh make clean
sh cmake .
sh make
如果你的项目包含多个模块或插件,确保所有模块在初始化 Protobuf 时不会重复注册文件描述符。
#include <google/protobuf/stubs/common.h> int main(int argc, char* argv[]) { GOOGLE_PROTOBUF_VERIFY_VERSION; // Your code here google::protobuf::ShutdownProtobufLibrary(); return 0; }
确保 GOOGLE_PROTOBUF_VERIFY_VERSION 只调用一次,并在程序结束时调用 ShutdownProtobufLibrary()。
GOOGLE_PROTOBUF_VERIFY_VERSION
ShutdownProtobufLibrary()
假设你在使用动态库,可以尝试如下方法确保动态库路径正确:
检查 LD_LIBRARY_PATH:
sh echo $LD_LIBRARY_PATH
设置正确的动态库路径:
sh export LD_LIBRARY_PATH=/path/to/correct/protobuf/lib:$LD_LIBRARY_PATH
运行程序:
sh ./your_program
如果上述方法仍未解决问题,请检查以下几点:
通过这些步骤,应该能解决 File already exists in database 错误。如果问题仍然存在,可以提供更多的上下文或错误日志,以便进一步诊断。
File already exists in database