此文档是windwos grpc c++ 编译 ,基于 vs2015 编译完成

获取gRPC源码

gRPC是开源框架,项目代码在github上,所以首先要安装github。
github安装后,在指定文件夹中,执行Git命令就可以获取gRPC的所有源码。

git clone https://github.com/grpc/grpc

虽然在github的gRPC主页上提供了源代码打包下载,但是gRPC的依赖组件就无法自动获取了。

获取gRPC的依赖组件

正如所有的项目一样,gRPC也是需要依赖第三方库。由于在gRPC中已经通过git.gitmodules文件定义了依赖组件,所以只需执行git命令就可以自动获取所有的依赖组件。

 cd grpc
git submodule update --init
 

(第三方库目录在third_party下面)

vs工程调试

用vs2015打开

vsprojects/grpc.sln

1,删除工程boringssl

2,在\grpc\third_party\zlib\gzguts.h

中将

  1. #ifdef _WIN32
  2. #  include <stddef.h>
  3. #endif

改成

  1. #ifdef _WIN32
  2. #  include <stddef.h>
  3. #pragma warning(disable:4996)
  4. #endif

去掉警告。

完成:可以编译

说明:NuGet有还原库,需要等待完成

编译protobuffer

gRPC依赖protobuffer进行消息编码,因此需要依赖protobuffer。(详细见:grpc\third_party\protobuf\cmake\README.md)

需要git,cmake支持

cmd打开vs命令行工具(Windows Desktop Command Prompts/VS2015 x64 x86 兼容工具命令提示符)

cd 到grpc目录

  1. cd protobuf
  1. git clone -b release-1.7.0 https://github.com/google/googlemock.git gmock
  1. cd gmock
  1. git clone -b release-1.7.0 https://github.com/google/googletest.git gtest
  1. cd ..\cmake
  1. mkdir build & cd build
  1. mkdir release & cd release
  1. cmake -G "NMake Makefiles" ^
  2. -DCMAKE_BUILD_TYPE=Release ^
  3. -DCMAKE_INSTALL_PREFIX=../../../../install ^
  4. ../..
  1. cd ..
  1. mkdir debug & cd debug
  1. cmake -G "NMake Makefiles" ^
  2. -DCMAKE_BUILD_TYPE=Debug ^
  3. -DCMAKE_INSTALL_PREFIX=../../../../install ^
  4. ../..
  1. cd ..
  1. mkdir solution & cd solution
  1. cmake -G "Visual Studio 14 2015 Win64" ^
  2. -DCMAKE_INSTALL_PREFIX=../../../../install ^
  3. ../..

打开grpc\third_party\protobuf\cmake\build\solution下protobuf.sln
编译成功

生成文件:
protoc.exe
libprotobuf.lib
libprotoc.lib

后续有用到

将编译好的Debug,Release文件夹拷贝到grpc\third_party\protobuf\cmake\目录下(Debug下面的lib文件后边的d需要去掉)

打开grpc\vsprojects\grpc_protoc_plugins.sln编译生成可执行文件

完成

生成文件:

grpc_cpp_plugin.exe
grpc_csharp_plugin.exe
grpc_node_plugin.exe
grpc_objective_c_plugin.exe
grpc_python_plugin.exe
grpc_ruby_plugin.exe

c++生成helloworld服务器程序

1.定义proto

(详细见:grpc\examples\protos\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插件,生成方法参考上文。

创建一个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生成的,后两个是插件生成的。

这些包括:

  • 所有的填充,序列化和获取我们请求和响应消息类型的 protocol buffer 代码
  • 名为 Greeter的类,包含
    • 为了客户端去调用定义在 Greeter服务的远程接口类型(或者 存根 )
    • 让服务器去实现的两个抽象接口,同时包括定义在 Greeter中的方法。

详细见:https://doc.oschina.net/grpc?t=57966

生成服务器端代码

3. 创建C++项目

依照grpc\examples\cpp\helloworld下client,server例子
greeter_async_client.cc
greeter_async_client2.cc
greeter_async_server.cc
greeter_client.cc
greeter_server.cc
 

4. 设置头文件

将刚刚生成的文件放入工程源代码目录$(SolutionDir)并包含进工程
GrpcTest\GrpcTest\src\protobuf

将:grpc\include,grpc\third_party\protobuf\src中的文件拷贝到include目录(自己的库目录)

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

5. 设置库

将:

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

放入lib目录(自己的lib库目录)

四个库文件路径:protobuf库路径、grpc库路径、zlib库路径、openssl库路径。
没有使用boringssl,openssl的库是从NuGet下载的package中找到的。

库文件

libprotobuf.lib;
grpc.lib;
gpr.lib;
grpc++.lib;
Ws2_32.lib;

6. 编译C++项目

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

错误A:

error C1189: #error :"Please compile grpc with _WIN32_WINNT of at least 0x600 (aka Windows Vista)"port_platform.h 59 Server_Cpp

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

错误B:

error C4996: 'std::_Copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check ****

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

_SCL_SECURE_NO_WARNINGS
_CRT_SECURE_NO_WARNINGS

错误C:

error LNK2038: mismatch detected for 'RuntimeLibrary': value

解决:只需要主程序和静态库都采用同一种Runtime Libray编译即可。
在项目属性C/C++中的 代码生成 的 运行库 选择 Multi-threaded(/MT)

OpenSSl我是添加的NuGet库来解决的

点击项目右键=>管理NuGet程序包

点击浏览=>输入grpc.dependencies.openssl

找到grpc.dependencies.openssl =>点击安装(我是用的v1.0.204.1版本)

完成,

编辑通过

c++生成helloworld client程序

 

依照

c++生成helloworld服务器程序

流程,

 
我使用的
greeter_client.cc
greeter_server.cc
两个测试来做的测试

说明:

附上一个编译好的版本,里面带了测试程序(helloworld)

http://download.csdn.NET/detail/xie1xiao1jun/9630779

点击打开链接

windwos grpc 编译的更多相关文章

  1. grpc编译错误解决

    berli@berli-VirtualBox:~/grpc$ make [MAKE]    Generating cache.mk [C]       Compiling src/core/lib/s ...

  2. grpc使用记录(一) gRPC编译(mscv/gcc)

    目录 1.编译前的准备工作 2.Windows下使用VS2019编译 2.1.使用cmake生成VS2019解决方案 2.2.使用msbuild工具进行编译 3.linux下编译 3.1 CentO ...

  3. gRPC编译教程

    windows平台的编译 一.编译openssl ① 安装perl(可以使用ActivePerl),执行perl Configure VC-WIN64A no-asm .在这里解释一下参数含义,VC- ...

  4. windwos 下编译minicap

    一.参考github 介绍:https://github.com/openstf/minicap Requirements (前提) NDK, Revision 10e (May 2015) make ...

  5. windwos 下编译 qsqlibase 驱动(firebird 和 interbase)

    编译环境:mingw-w64 使用qtcreator打开ibase.pro,ibase.pro位置例如:R:\qt-everywhere-opensource-src-4.8.5\src\plugin ...

  6. 编译gRPC

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

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

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

  8. grpc vs2015编译

    获取gRPC源码 gRPC是开源框架,项目代码在github上,所以首先要安装github.github安装后,在指定文件夹中,执行git命令就可以获取gRPC的所有源码. git clone  ht ...

  9. PHP7 学习笔记(十二)gRPC

    GitHub:https://github.com/grpc/grpc/tree/master/src/php 环境:Linux + php7 1.安装grpc pecl install grpc 编 ...

随机推荐

  1. Git Cheatshell - Pro Git

    A git cheatshell based on the book: http://www.git-scm.com/book/en/v2. Repository Configuration git ...

  2. Linux下添加桌面快捷方式

    这里用Ubuntu下BurpSuite举例 sudo vim /home/user/Desktop/burpsuite.desktop //burpsuite随意起名,系统会系动创建文件 文件写入 # ...

  3. python面向对象三大特性

    面向对象的三大特性: 封装.继承和多态 一.封装 封装,顾名思义就是将内容封装到某个地方,以后可以直接调用被封装到某处的内容. - 将内容封装到某处 - 从某处调用被封装的内容 第一步,将内容封装到某 ...

  4. SetConsoleCtrlHandler

    Excerpt: Registering a Control Handler Function   This is an example of the SetConsoleCtrlHandler fu ...

  5. CentOS 单用户模式:修改Root密码和grub加密[转]

    原文出处: http://zhengdl126.iteye.com/blog/430268 Linux 系统处于正常状态时,服务器主机开机(或重新启动)后,能够由系统引导器程序自动引导 Linux 系 ...

  6. ARC下还会存在内存泄露吗?

    1.第三方框架不正当使用.2.block,delegate,NSTimer循环使用.3.非oc对象的内存处理.4.地图类处理.5.大次数循环内存暴涨. 非oc对象的释放: 例如使用CGImageRel ...

  7. dealloc时取weakself引起崩溃

    今天无意这中遇到一个奇怪的崩溃,先上引起崩溃的代码: - (void)dealloc { __weak __typeof(self)weak_self = self; NSLog(@"%@& ...

  8. NSThread那些事儿

    NSThread 哎呀,它面向对象,再去看看苹果提供的API,对比一下Pthreads,简单明了,人生仿佛又充满了阳光和希望,我们先来一看一下系统提供给我们的API自然就知道怎么用了,来来来,我给你注 ...

  9. Kotlin中功能操作与集合(KAD 11)

    作者:Antonio Leiva 时间:Feb 2, 2017 原文链接:https://antonioleiva.com/functional-operations-collections-kotl ...

  10. Mini-MBA记录

    最近学完了Mini-MBA的课程,对课程讲述的人力资源,创新,财务,战略,领导力等方面有了更深一些的了解,在此之上也做了一些笔记,如果课程信息披露是被允许的,后续把这些笔记贴出来,作为自己以后的参考.