小能豆

protobuf动态静态问题

javascript

[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

尝试了很多方法,不知道该如何解决上面这个问题,好像是因为动态存储的问题


阅读 62

收藏
2024-06-02

共1个答案

小能豆

这个错误通常是由加载多个不同版本的 Protobuf 库或重复加载同一版本的 Protobuf 库引起的。当 Protobuf 库尝试注册同一个文件描述符(如 google/protobuf/descriptor.proto)多次时,就会发生这个错误。

以下是一些解决此问题的方法:

方法 1:检查和更新 Protobuf 版本

确保你的项目中所有依赖项使用的 Protobuf 版本是一致的。不同版本之间的冲突是常见的原因之一。

  1. 更新所有依赖项:检查你的项目及其所有依赖项使用的 Protobuf 版本。如果版本不一致,尝试更新它们使其一致。
  2. 重新编译:重新编译所有依赖项,以确保它们使用相同版本的 Protobuf。

方法 2:检查动态库加载

如果你在使用动态库(如 .so 文件),确保在运行时没有重复加载多个版本的 Protobuf 动态库。

  1. 动态库路径:检查 LD_LIBRARY_PATH 环境变量,确保它指向正确的 Protobuf 库路径。
  2. 静态链接:如果可能,尝试将 Protobuf 静态链接到你的应用程序中,避免动态库版本冲突。

方法 3:避免重复初始化 Protobuf

确保 Protobuf 库只初始化一次。如果在多个地方初始化 Protobuf,可能会导致文件描述符重复注册。

方法 4:清理和重新构建

有时,构建过程中的缓存或临时文件可能会导致问题。尝试清理和重新构建你的项目。

  1. 清理构建目录
    sh make clean
  2. 重新生成构建文件
    sh cmake .
  3. 重新编译
    sh make

方法 5:检查和修改代码

如果你的项目包含多个模块或插件,确保所有模块在初始化 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()

示例解决方案

假设你在使用动态库,可以尝试如下方法确保动态库路径正确:

  1. 检查 LD_LIBRARY_PATH

    sh echo $LD_LIBRARY_PATH

  2. 设置正确的动态库路径

    sh export LD_LIBRARY_PATH=/path/to/correct/protobuf/lib:$LD_LIBRARY_PATH

  3. 运行程序

    sh ./your_program

如果上述方法仍未解决问题,请检查以下几点:

  1. 依赖冲突:确保所有依赖项使用的是同一版本的 Protobuf 库。
  2. 重复加载:确认没有重复加载 Protobuf 库。
  3. 清理缓存:清理构建缓存和临时文件,重新编译所有依赖项。

通过这些步骤,应该能解决 File already exists in database 错误。如果问题仍然存在,可以提供更多的上下文或错误日志,以便进一步诊断。

2024-06-02