Я попытался создать собственный буфер протокола в 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:
Наконец, еслиЯ создаю файл .proto с protoc напрямую, я получаю 3006001 в файле pb.h, просто чтобы показать, что я правильно установил protoc.
У меня вопрос , где 3005000 воткуда взялся файл pb.h?Это gcc, bazel, tenorflow, protoc или pip / protobuf?