необъявленный идентификатор временной метки google protobuf с C ++ на Windows - PullRequest
1 голос
/ 14 февраля 2020

У меня есть Windows нативный проект C ++, который использует google protobufs (синтаксис версии 3) и gRP C. У меня есть .proto файл, который включает тип Timestamp, как это:

import "timestamp.proto";

Я могу успешно сгенерировать (используя proto c .exe). cc и .h файлы сообщений и служб в моем файле .proto без каких-либо ошибок или предупреждений. Я также могу сгенерировать вывод для gRP C из файла .proto без ошибок и предупреждений.

Когда я использую эти сгенерированные файлы в проекте Visual Studio, я вижу эти ошибки в файле. cc генерируется из моего .proto файла. Все они связаны с типом Timestamp:

Error C2491 'scc_info_Timestamp_google_2fprotobuf_2ftimestamp_2eproto': definition of dllimport data not allowed
Error C2491 'TableStruct_google_2fprotobuf_2ftimestamp_2eproto::offsets': definition of dllimport static data member not allowed
Error C2653 'PROTOBUF_INTERNAL_EXPORT_timestamp_2eproto': is not a class or namespace name
Error C2059 syntax error: '<'
Error C2065 'scc_info_Timestamp_timestamp_2eproto': undeclared identifier
Error C2065 'scc_info_Timestamp_timestamp_2eproto': undeclared identifier
Error C2039 'descriptor_table_timestamp_2eproto': is not a member of ''global namespace''
Error C2065 'descriptor_table_timestamp_2eproto': undeclared identifier

Я добавил файлы Timestamp.pb.h /.cc в заголовочные файлы проекта Visual Studio, а также другие .h / .cc файлы, сгенерированные из моего .proto файла.

Я понятия не имею, как go решить эту проблему. Я убедился, что удаление типа Timestamp позволяет успешно построить проект. Я попробовал старую версию protobufs. И, конечно, гуглил часами ...

Мое окружение:

Windows 10
Visual Studio 2017
vcpkg (Microsoft C++ package manager) used to build Protocol buffers 3.11.3 and gRPC 1.27.1

Есть предложения?

1 Ответ

0 голосов
/ 17 февраля 2020

Я нашел решение для этой проблемы. В основном это было вызвано моим путем включения папки. Путь к VS включает путь "\ include \ google \ protobuf", в котором находятся все файлы .h, созданные из файлов .proto. Мне нужно было, чтобы папка включения была просто установлена ​​в «\ include». Это позволило мне изменить мой файл .proto, чтобы он ссылался на тип метки времени следующим образом:

import "google / protobuf / timestamp.proto";

вместо того, как я ссылался на него:

import "timestamp.proto";

Кроме того - я обнаружил, что мне не нужно включать "timestamp.pb. cc" в мой проект. Я еще не до конца выяснил, почему это так, но, похоже, пара тестов показывает, что это действительно не нужно.

...