Несоответствие версии протокола bazel tensorflow

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

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

При более внимательном изучении причины вышеуказанной ошибки я непосредственно заглянул в файлы 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"],
)

Я также вижу версию 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 прототипов.

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

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

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

Я также пробовал несколько версий bazel, от 0.15.x до 0.18.x; в более высоких версиях не удается создать tensorflow_model_server, поэтому я не пробовал. Все они дают 3005000 для pb.h, созданного на основе правила cc_proto_library bazel.

Официальный документ tensorflow говорит, что tf 1.12 был протестирован с bazel 0.15:  введите описание изображения здесь

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

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


person John Jiang    schedule 21.03.2019    source источник


Ответы (1)


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

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

# closure_repositories()

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

person John Jiang    schedule 01.04.2019