Связывание gRP C на Windows для VisualC ++ - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь использовать gRP C в проекте Visual C ++.

Пока у меня есть:

1) Сборка gRPC с vcpkg: vcpkg install grpc:x64-windows 2 ) Интегрированы библиотеки vcpgk с Visual Studio: vcpkg integrate install

Пока все хорошо - intellisense автоматически заполняет пространство имен и т. Д. c.

Файл моего клиента cpp выглядит следующим образом :

#include "pch.h"
#include <iostream>
#include <memory>
#include <string>
#include <grpcpp\grpcpp.h>
#include "GRPCServerInterface.grpc.pb.h"
#include "FileFormat.pb.h"

using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;
using namespace GRPCServerInterface;

int main()
{
    std::cout << "Hello World!\n";

    // prepare send message & payload
    IsFormatSupportedInput msg;
    msg.set_fileextension(".asp");

    // prepare reply
    IsFormatSupportedOutput rpl;

    // connect
    FileHandler::Stub ClientStub = FileHandler::Stub(grpc::CreateChannel("localhost:50051", grpc::InsecureChannelCredentials()));

    ClientContext context;

    // execute rpc
    Status status = ClientStub.IsFormatSupported(&context, msg, &rpl);

    // handle result
    if (status.ok()) 
    {
        std::cout << "Format supported says:" << std::endl << "\t formats read: " << rpl.readsupportedformats() << std::endl << "\t formats write: " << rpl.writesupportedformats() << std::endl;
    }
    else
    {
        std::cout << status.error_code() << ": " << status.error_message() << std::endl;
    }
}

Все сообщения и proto файлы завершаются и работают в целом, поскольку я уже использую их в проектах python и c#.

При сборке Visual Studio создает Примерно 125 ошибок, все в файлах, которых я никогда не трогал.

В GRPCServerInterface.pb.h есть identifier GOOGLE_DCHECK is undefined

Все остальные ошибки member abc may not be initialized в различных заголовочных файлах в grp c включает, например, member "google::protobuf::Any::kIndexInFileMessages" may not be initialized в файле any.pb.h. Многие другие в type.pb.h и descriptor.pbp.h.

И последнее, но не менее важное: мне предлагается добавить #iclude "pch.h" к автоматически сгенерированным классам protobuf grpcserverinterface.grpc.pb.cc и grpcserverinterface.pb.cc - добавление этого немного изменится, но в основном все ошибки все еще undefined symbol и member may not be initialized. И я действительно не хочу изменять автоматически сгенерированный код каждый раз.

Что мне не хватает? Или это просто бесполезная попытка использовать grp c с Visual Studio, и я должен просто перейти к среде сборки, такой как bazel?

1 Ответ

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

Решено!

Два шага для решения:

1) Я отключил скомпилированные заголовки для всего проекта - это убрало #include "pch.h go. Вы можете, вероятно, сойти с рук, отключив его только для файлов protobuf, поскольку это может быть сделано для каждого отдельного файла.

2) Одна из последних перечисленных ошибок была unresolved external symbol __imp_WSASocketA, что в итоге привело меня к этот вопрос Неразрешенный внешний символ LNK2019 . Я просто включил #pragma comment(lib, "Ws2_32.lib") в один исходный файл, и теперь все работает просто отлично.

...