在 Ubuntu 中获取“[libprotobuf ERROR external/com_google_protobuf/src/google/protobuf/descriptor_database.cc:642] 文件已存在于数据库中:”

问题描述 投票:0回答:1

使用 Bazel 完成项目构建后,在 Ubuntu 20.04 上执行二进制文件时出现以下错误。

[libprotobuf ERROR external/com_google_protobuf/src/google/protobuf/descriptor_database.cc:642] File already exists in database: tensorflow/compiler/mlir/quantization/tensorflow/quantization_options.proto
[libprotobuf FATAL external/com_google_protobuf/src/google/protobuf/descriptor.cc:1986] CHECK failed: GeneratedDatabase()->Add(encoded_file_descriptor, size): 
terminate called after throwing an instance of 'google::protobuf::FatalException'
  what():  CHECK failed: GeneratedDatabase()->Add(encoded_file_descriptor, size): 
Aborted (core dumped)

似乎存在与 protobuf 库相关的重复,但我很难弄清楚重复来自哪里,因为再现器仅依赖于tensorflow,没有任何插件。

再现器的代码如下。

工作空间

workspace(name = "reproducer")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "bazel_skylib",
    sha256 = "74d544d96f4a5bb630d465ca8bbcfe231e3594e5aae57e1edbf17a6eb3ca2506",
    urls = [
        "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.3.0/bazel-skylib-1.3.0.tar.gz",
        "https://github.com/bazelbuild/bazel-skylib/releases/download/1.3.0/bazel-skylib-1.3.0.tar.gz",
    ],
)

load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace")

bazel_skylib_workspace()

local_repository(
    name = "org_tensorflow",
    path = "tensorflow"
)

load("@org_tensorflow//tensorflow:workspace3.bzl", "tf_workspace3")
tf_workspace3()
load("@org_tensorflow//tensorflow:workspace2.bzl", "tf_workspace2")
tf_workspace2()
load("@org_tensorflow//tensorflow:workspace1.bzl", "tf_workspace1")
tf_workspace1()
load("@org_tensorflow//tensorflow:workspace0.bzl", "tf_workspace0")
tf_workspace0()

建造

load("@org_tensorflow//tensorflow:tensorflow.bzl", "tf_cc_binary")

tf_cc_binary(
    name = "test",
    srcs = ["test.cc"],
    deps = [
        "@org_tensorflow//tensorflow/compiler/mlir/lite:tf_to_tfl_flatbuffer",
    ],
)

测试.cc

#include <iostream>

int main(int argc, char *argv[]) {
    std::cout << "Hello World!" << std::endl;

    return 0;
}

本地tensorflow存储库是官方tensorflow github的commit hash 0db597d0d758aba578783b5bf46c889700a45085。我使用此版本是为了与完整项目中的其他存储库兼容。

"@org_tensorflow//tensorflow/compiler/mlir/lite:tf_to_tfl_flatbuffer"
的依赖会触发重复;没有它就没有问题。

此外,相同的代码在 M1 的 Mac 操作系统上运行也没有问题。

有什么建议来处理这个问题吗?谢谢你。

c++ tensorflow build protocol-buffers bazel
1个回答
0
投票

对于有同样问题的人,

build --define tsl_protobuf_header_only=true
文件中添加
.bazelrc
选项解决了该问题。该标志会触发对
@com_google_protobuf//:protobuf
的依赖清理,这是导致重复的原因。

© www.soinside.com 2019 - 2024. All rights reserved.