Reputation: 1419
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
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