使用 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 操作系统上运行也没有问题。
有什么建议来处理这个问题吗?谢谢你。
对于有同样问题的人,
在
build --define tsl_protobuf_header_only=true
文件中添加 .bazelrc
选项解决了该问题。该标志会触发对 @com_google_protobuf//:protobuf
的依赖清理,这是导致重复的原因。