Должен ли protoc v2.6.1 выдавать «Ожидаемый», «необязательный» или «повторный». - PullRequest
0 голосов
/ 15 ноября 2018

Используя Ubuntu 16.04 и CMake, я пытаюсь создать общую библиотеку из файлов protobuf.CMakes protobuf_generate_cpp создает PROTO_SRCS и PROTO_HDRS.

У меня не было никаких файлов google / protobuf / *. Proto в моей системе, поэтому я загрузил 3.6.1 и переместил их в / usr / local / include.Я знаю, что я использую proto2, а protoc версии 2, и некоторые из этих * .proto файлов в 3.6.1 являются proto3, но файлы ниже (те, что я использую, это syntax = "proto2"), поэтомуЯ думаю, что все должно быть в порядке.

Однако я сталкиваюсь со следующей ошибкой.

 $ protoc --version
libprotoc 2.6.1

[  2%] Running C++ protocol buffer compiler on models.proto
google/protobuf/descriptor.proto:439:3: Expected "required", "optional", or "repeated".
google/protobuf/descriptor.proto:439:12: Expected field name.
google/protobuf/descriptor.proto:497:3: Expected "required", "optional", or "repeated".
google/protobuf/descriptor.proto:497:12: Expected field name.
google/protobuf/descriptor.proto:498:3: Expected "required", "optional", or "repeated".
google/protobuf/descriptor.proto:498:12: Expected field name.
google/protobuf/descriptor.proto:597:3: Expected "required", "optional", or "repeated".
google/protobuf/descriptor.proto:597:12: Expected field name.
google/protobuf/descriptor.proto:620:3: Expected "required", "optional", or "repeated".
google/protobuf/descriptor.proto:620:12: Expected field name.
edk/edk_extensions.proto: Import "google/protobuf/descriptor.proto" was not found or had errors.
edk/edk_extensions.proto:15:8: ".google.protobuf.FieldOptions" is not defined.
edk/edk_extensions.proto:20:8: ".google.protobuf.MessageOptions" is not defined.
models.proto: Import "edk/edk_extensions.proto" was not found or had errors.

У кого-нибудь есть мысли?

1 Ответ

0 голосов
/ 15 ноября 2018

Последние версии descriptor.proto объявляют зарезервированные поля - в качестве примера строка 439 . Это новый синтаксис, который был перенесен обратно в синтаксис proto2, но старые версии protoc его не поймут (по понятным причинам). Либо обновите protoc, либо используйте descriptor.proto, который поставляется вместе с используемым вами протоколом.

...