несоответствие версии Bazel tenorflow - PullRequest
0 голосов
/ 22 марта 2019

Я попытался создать собственный буфер протокола в bazel в tenorflow r1.12.0 (gcc версии 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)), но продолжаю сталкиваться со следующим сообщением об ошибке

Этот файл был сгенерирован новой версией protoc, которая несовместима с вашими заголовками буфера протокола.Пожалуйста, обновите ваши заголовки.

После более тщательного изучения причины вышеуказанной ошибки, я посмотрел непосредственно в файлы bazel-genfiles и обнаружил, что для уже существующих файлов pb.h, таких как examples.pb.h, жестко заданная версия bazel - 3.6.0:

#if GOOGLE_PROTOBUF_VERSION < 3006000
#error This file was generated by a newer version of protoc which is
#error incompatible with your Protocol Buffer headers.  Please update
#error your headers.
#endif
#if 3006000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers.  Please
#error regenerate this file with a newer version of protoc.
#endif

Но для файла pb.h моего собственного буфера настраиваемого протокола он показывает версию 3.5:

#if GOOGLE_PROTOBUF_VERSION < 3005000
#error This file was generated by a newer version of protoc which is
#error incompatible with your Protocol Buffer headers.  Please update
#error your headers.
#endif
#if 3005000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers.  Please
#error regenerate this file with a newer version of protoc.
#endif

Таким образомнесовместимость.

Действительно, если я сам собираю examples.proto с помощью правила cc_proto_library, как это,

cc_proto_library(
    name = "example_cc_protos",
    deps = [":example_protos"],
)

Я также вижу versionn 3005000 в сгенерированном файле examples.pb.h, поэтомуфайл 3006000 pb.h, приведенный выше, вероятно, был загружен из удаленного источника.

Мой pip / protobuf показывает версию 3.6.1, а protoc --version также показывает 3.6.1, поэтому я подозревал, что protobuf внутри самого bazelдолжен быть версии 3.5, что привело к приведенному выше к сожалению жесткому кодированию 3005000.

Я обнаружил, что protobuf 3.6.1 стал доступен с bazel 0.17 ; аналогичная ссылка для bazel 0.16 дает мне 404. Таким образом, я попытался установить bazel 0.17 с помощью готового установщика на GitHub.Но удивительно, что сгенерированный файл pb.h все еще содержит 3005000 прототипов в жестком коде.

Затем я попытался собрать bazel из источника через

git clone https://github.com/bazelbuild/bazel.git
cd bazel
bazel build //src:bazel
alias bazel=bazel-bin/src/bazel

Но это все равно дало мне ту же ошибку.

Я также пробовал несколько версий bazel изОт 0,15 до 0,18;более поздние версии не в состоянии построить tenorflow_model_server, поэтому я не пробовал.Все они приводят к 3005000 для pb.h, построенного по правилу bazel cc_proto_library.

Официальный документ tensflow сообщает, что tf 1.12 был протестирован с bazel 0.15: enter image description here

Наконец, еслиЯ создаю файл .proto с protoc напрямую, я получаю 3006001 в файле pb.h, просто чтобы показать, что я правильно установил protoc.

У меня вопрос , где 3005000 воткуда взялся файл pb.h?Это gcc, bazel, tenorflow, protoc или pip / protobuf?

1 Ответ

0 голосов
/ 01 апреля 2019

Эта проблема была решена путем удаления следующего пакета внешних зависимостей из Файл tennsflow / WORKSPACE:

# load("@io_bazel_rules_closure//closure:defs.bzl", "closure_repositories")

# closure_repositories()

Причина в том, что closure_repositories использует protobuf 3.5, поскольку для 3.6 требуется g ++ 11, который не является общедоступным.

...