我的这几篇文章都是使用gRPC的example,不是直接编译example,而是新建一个项目,从添加依赖,编译example代码,执行example。这样做可以为我们创建自己的项目提供借鉴。如果对gRPC构建应用很熟悉,可以无视本系列文章。

目录

一、概述

二、编译gRPC

三、C#中使用gRPC

四、C++中使用gRPC

上篇介绍了C#调用gRPC,C#项目比较幸运有NuGet帮助配置,C++项目就没有那么幸运了。配置复杂,编译问题也很多。我在这里把我遇到的情况都列出来,使大家在遇到相同的问题时,少走一些弯路。

1.定义proto

helloworld.proto文件内容:

syntax = "proto3";

option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW"; package helloworld; // The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
} // The request message containing the user's name.
message HelloRequest {
string name = 1;
} // The response message containing the greetings
message HelloReply {
string message = 1;
}

2. 生成访问代码

将proto.exe、helloworld.proto、grpc_cpp_plugin.exe拷贝到一个文件夹中,grpc_cpp_plugin.exe是gRPC的protoc插件,生成方法参考我的《编译gRPC》一文。

创建一个bat文件,包含以下命令:

protoc.exe -I=. --grpc_out=. --plugin=protoc-gen-grpc=.\grpc_cpp_plugin.exe helloworld.proto
protoc.exe -I=. --cpp_out=. helloworld.proto

生成了两套文件

hellowworld.pb.h
hellowworld.pb.cc
hellowworld.grpc.pb.h
hellowworld.grpc.pb.cc

其中前两个是protoc生成的,后两个是插件生成的。

3. 创建C++项目

4. 设置头文件

D:\XXXX\grpc\include;
D:\XXXX\grpc\third_party\protobuf\src;
$(ProjectDir)..\proto

三个头文件目录,一个是gRPC的头文件,一个是protobuf的头文件,一个是刚生成的的访问类路径。

5. 设置库

路径

D:\XXXX\grpc\third_party\protobuf\cmake\Release;
D:\XXXX\grpc\vsprojects\Release;
D:\XXXX\grpc\third_party\zlib\solution\Release;
D:\XXXX\grpc\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\lib\v120\Win32\Release\static

四个库文件路径:protobuf库路径、grpc库路径、zlib库路径、openssl库路径。

没有使用boringssl,openssl的库是从NuGet下载的package中找到的。

库文件

libprotobuf.lib;
grpc.lib;
gpr.lib;
grpc++.lib;
Ws2_32.lib;
libeay32.lib;
ssleay32.lib;
zlibstatic.lib;
%(AdditionalDependencies)

6. 编译C++项目

将gRPC的C++ example的代码拷贝到我们刚创建的项目中,编译,出现一些error:

错误A:

Error    2    error C1189: #error :      "Please compile grpc with _WIN32_WINNT of at least 0x600 (aka Windows Vista)"    d:\projects_framework\grpc\include\grpc\impl\codegen\port_platform.h    59    1    Server_Cpp

解决:在项目属性中的Preprocessor Definitions中添加_WIN32_WINNT=0x600

错误B:

Error    1    error C4996: 'std::_Copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'    c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility    2132    1    Server_Cpp

解决:在项目属性中的Preprocessor Definitions中添加

_SCL_SECURE_NO_WARNINGS
_CRT_SECURE_NO_WARNINGS

错误C:

error LNK2038: mismatch detected for 'RuntimeLibrary': value

解决:只需要主程序和静态库都采用同一种Runtime Libray编译即可。

在项目属性C/C++中的Code Generation的Runtime Library选择Multi-threaded(/MT)

错误D:

Error    2    error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MTd_StaticDebug' in greeter_server.obj    D:\Projects_My\gRPC\gRPC_cpp\Server_Cpp\libprotobuf.lib(generated_message_util.obj)    Server_Cpp

解决:原因是将debug的配置拷贝到release时,将Preprocessor Definitions的_DEBUG也考到release中了,去掉_DEBUG即可

错误E:

Error    113    error LNK2001: unresolved external symbol _SSL_state    D:\Projects_My\gRPC\gRPC_cpp\Server_Cpp\grpc.lib(ssl_transport_security.obj)    Server_Cpp

解决:添加openssl的lib(用v120,可能是vs的版本号)

D:\XXXX\grpc\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\lib\v120\Win32\Release\static

库文件:

libeay32.lib
ssleay32.lib

错误F:

Error    2    error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in LIBCMT.lib(typinfo.obj)    D:\Projects_My\gRPC\gRPC_cpp\Server_Cpp\msvcrt.lib(ti_inst.obj)    Server_Cpp

解决:

Project Settings:

-> Configration Properties -> Linker -> Input -> Ignore Specific Library: LIBCMT.lib

至此,C++的gRPC项目编译通过。

初识google多语言通信框架gRPC系列(四)C++中使用gRPC的更多相关文章

  1. 初识google多语言通信框架gRPC系列(一)概述

    gRPC概述 3/26/2016 9:16:08 AM 目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 一直在寻找多平台多语言的通信框架,微软的WCF框架很强大和灵 ...

  2. 初识google多语言通信框架gRPC系列(三)C#中使用gRPC

    我的这几篇文章都是使用gRPC的example,不是直接编译example,而是新建一个项目,从添加依赖,编译example代码,执行example.这样做可以为我们创建自己的项目提供借鉴.如果对gR ...

  3. 初识google多语言通信框架gRPC系列(二)编译gRPC

    目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 无论通过哪种语言调用gRPC,都必须要编译gRPC,因为生成proto访问类时,除了产生标准的数据定义类之外,还需要 ...

  4. google多语言通信框架gRPC

    google多语言通信框架gRPC系列(一)概述 gRPC概述 3/26/2016 9:16:08 AM 目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 一直在寻找 ...

  5. spring框架应用系列四:切面编程(环绕通知与前后置通知区别)

    切面编程(环绕通知与前后置通知区别) 本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7867034.html 解决问 ...

  6. [gRPC] 在 .NET Core 中创建 gRPC 服务端和客户端

    gRPC 官网:https://grpc.io/ 1. 创建服务端 1.1 基于 ASP.NET Core Web 应用程序模板创建 gRPC Server 项目. 1.2 编译并运行 2. 创建客户 ...

  7. Google C++单元测试框架GoogleTest(总)

    之前一个月都在学习googletest框架,对googletest的文档都翻译了一遍,也都发在了之前的博客里,另外其实还有一部分的文档我没有发,就是GMock的CookBook部分:https://g ...

  8. .NET Core 3 WPF MVVM框架 Prism系列之命令

    本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的命令的用法 一.创建DelegateCommand命令 我们在上一篇.NET Core 3 WPF MVVM框架 Prism系列之 ...

  9. C#中使用gRPC

    C#中使用gRPC 我的这几篇文章都是使用gRPC的example,不是直接编译example,而是新建一个项目,从添加依赖,编译example代码,执行example.这样做可以为我们创建自己的项目 ...

随机推荐

  1. HDU 3478 Play with Chain (Splay树)

    这种高级数据结构太难搞了.........现在还是先照着别人的代码敲,做模板..........慢慢花时间来弄懂 #include <iostream> #include <algo ...

  2. 管道实现进程间通讯 、WaitNamedPipe

    一.管道实现进程间通讯 主要的理论知识 1.什么是管道以及分类 管道是两个头的东西,每一个头各连接一个进程或者同一个进程的不同代码,依照管道的类别分有两种管道,匿名的和命名的:依照管道的传输方向分也能 ...

  3. centos 安装 redis3.2.0 集群

    这里创建6个redis节点,其中三个为主节点,三个为从节点. redis和端口对应关系: 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 从: 127.0.0 ...

  4. WebSocket是一种协议

    WebSocket,并非HTML 5独有,WebSocket是一种协议.只是在handshake的时候,发送的链接信息头和HTTP相似.HTML 5只是实现了WebSocket的客户端.其实,难点在于 ...

  5. Mojo Mysql utf-8字符集 需要{mysql_enable_utf8 => 1}

    get '/api/log_mon/get_log' => sub{ my $c = shift; my $env = $c->param('env'); my $host = $c-&g ...

  6. OGEngine教程:声音载入

    以下介绍声音资源从载入到播放的一个流程 首先,我们将须要的音频文件放到assets文件夹下,OGE中SoundRes和MusicRes为我们封装了非常多经常使用的方法,能够用于载入及播放等经常使用功能 ...

  7. 使用Seam Framework + JBoss 5.0 开发第一个Web应用 - 简单投票程序

    Seam这个单词的本意是缝合.连接,因而,Seam的作用即是把Java EE 规范里的JSF 和 EJB技术完美融合在一起,免去了很多胶合代码,并增强了JSF 和 EJB的很多功能.Seam的设计目标 ...

  8. HBase总结(二十)HBase经常使用shell命令具体说明

    进入hbase shell console $HBASE_HOME/bin/hbase shell 假设有kerberos认证,须要事先使用对应的keytab进行一下认证(使用kinit命令),认证成 ...

  9. 一种单片机支持WiFi的应用——SimpleWiFi在单片机中的应用

    一种单片机支持WiFi的应用——SimpleWiFi在单片机中的应用 先上图: 现在的智能控制都是基于微控制器,随着智能的手持终端的普及,基于智能终端的控制就会越来越普遍. WIFI便是其中的一种.W ...

  10. csdn肿么了,这两天写的博文都是待审核

    昨天早上8点写了一篇博文,然后点击发表,结果系统显示"待审核".于是仅仅好qq联系csdn的客服,等到9点时候,csdn的客服上线了,然后回复说是链接达到5个以上须要审核,于是回到 ...