user3696412
user3696412

Reputation: 1419

Linking gRPC on Windows for VisualC++

I am trying to use gRPC in a Visual C++ project.

So far I have:

1) Build gRPC with vcpkg: vcpkg install grpc:x64-windows 2) Integrated the vcpgk libraries with visual studio: vcpkg integrate install

So far, so good - intellisense autocompletes the namespace etc.

My client cpp file looks like this:

#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;
    }
}

All messages & proto files exits and work in general, since I already use them in python and c# projects.

When building, Visual Studio generates a boatload of 125 errors, all in files I never touched.

In GRPCServerInterface.pb.h, there is identifier GOOGLE_DCHECK is undefined

All other errors are member abc may not be initialized in various header files in the grpc includes, for example member "google::protobuf::Any::kIndexInFileMessages" may not be initialized in file any.pb.h. Many more in type.pb.h and descriptor.pbp.h.

Last but not least, I get prompted add #iclude "pch.h" to the auto-generated protobuf classes grpcserverinterface.grpc.pb.cc and grpcserverinterface.pb.cc - adding it changes a bit, but basically all errors are still undefined symbol and member may not be initialized. And I really do not want to modify auto-generated code every time.

What am I missing? Or is it just a fruitless endeavor to try using grpc with Visual Studio and should I just move to a build framework like bazel?

Upvotes: 4

Views: 4401

Answers (1)

user3696412
user3696412

Reputation: 1419

Solved it!

Two steps for solving:

1) I disabled precompiled headers for the whole project - this made the #include "pch.h go away. You could probalby get away with disabling it just for the protobuf files, as it can be done on a per-file basis.

2) One of the last errors listed was unresolved external symbol __imp_WSASocketA, which finally led me to this question Unresolved external symbol LNK2019. I just included #pragma comment(lib, "Ws2_32.lib") in one source file, and now everything works just perfect.

Upvotes: 5

Related Questions