此文档是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. 笔记-mysql-管理及基础操作

    笔记-mysql使用-管理及基础操作 1.      简介 mysql是一个免费的关系型数据库,不过好像被oracle收购了.... 希望它继续免费. 1.1.    相关术语 数据库,表,列,行,冗 ...

  2. 使用Yeoman自动构建Ember项目

    Yeoman是什么? Yeoman按照官方说法,它不只是一个工具,还是一个工作流.它其实包括了三个部分yo.grunt.bower,分别用于项目的启动.文件操作.包管理. Yo: Yo是一个项目初始化 ...

  3. 4 CSS的20/80个知识点

    1.css的基本构成 样式选择器 id选择器 元素选择器 2.css的盒模型 border padding margin 3.Atom快捷键 4.程序 (1)初始程序 <!DOCTYPE htm ...

  4. vue-i18n vue-cli项目中实现国际化 多语言切换功能 一

    vue-cli项目中引入vue-i18n 安装: npm install vue-i18n可参考vue-i18n官网文档 main.js中引入: import Vue from 'vue' impor ...

  5. 有关ViewPager的使用及解决Android下ViewPager和PagerAdapter中调用notifyDataSetChanged失效的问题

    ViewPager是android-support-v4.jar包中的一个系统控件,继承自ViewGroup,专门用以实现左右滑动切换View的效果,使用时需要首先在Project->prope ...

  6. 《数据结构与算法分析:C语言描述》复习——第七章“哈希”——哈希表

    2014.06.22 12:36 简介: 哈希是一种数学思想,将不定长数据通过函数转换为定长数据.不定长数据通常意味着碎片化,动态分配内存等等影响存储和性能的因素.当这个定长数据是一个无符号整数时,可 ...

  7. WPF and Silverlight.ComboBox 如何通过 Binding IsDropDownOpen 实现下拉菜单展开

    In the WPF example the Popup and the ToggleButton (the arrow on the right) are bound with the proper ...

  8. bat批处理 批量导出多个APK的AAPT信息(含python实现)

    产品APP因架构调整,将一个APK拆分成了十几个APK,这样每次打ROM前,都要一个个核对APK的AAPT信息 一个个APK去敲命令很繁琐,想到可以用BAT批处理调用AAPT命令一次将十几个APK的A ...

  9. PHP vscode+XDebug 远程断点调试服务器上的代码

    对于简单的项目或仅仅想知道某一位置的某个变量是什么值,直接使用var_dump配置exit来打印和中断就可以了,方便又快捷, 而对于大型项目的调试,或想了解某个系统的整个运行过程,xdebug可能会是 ...

  10. 第二阶段团队冲刺-four

    昨天: 绘制logo. 今天: 用servlet完成名单打印功能. 遇到的问题: servlet中的获得的路径不是想要的.