windwos grpc 编译

此文档是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

中将

 

 

[cpp] view plain copy

 

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

改成

 

 

[cpp] view plain copy

 

  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目录

 

[cpp] view plain copy

 

  1. cd protobuf  

[cpp] view plain copy

 

  1. git clone -b release-1.7.0 https://github.com/google/googlemock.git gmock  

[cpp] view plain copy

 

  1. cd gmock  

[cpp] view plain copy

 

  1. git clone -b release-1.7.0 https://github.com/google/googletest.git gtest  

[cpp] view plain copy

 

  1. cd ..\cmake  

[cpp] view plain copy

 

  1. mkdir build & cd build  

[cpp] view plain copy

 

  1. mkdir release & cd release  

[cpp] view plain copy

 

  1. cmake -G "NMake Makefiles" ^  
  2.      -DCMAKE_BUILD_TYPE=Release ^  
  3.      -DCMAKE_INSTALL_PREFIX=../../../../install ^  
  4.      ../..  

[cpp] view plain copy

 

  1. cd ..  

[cpp] view plain copy

 

  1. mkdir debug & cd debug  

[cpp] view plain copy

 

  1. cmake -G "NMake Makefiles" ^  
  2.      -DCMAKE_BUILD_TYPE=Debug ^  
  3.      -DCMAKE_INSTALL_PREFIX=../../../../install ^  
  4.      ../..  

[cpp] view plain copy

 

  1. cd ..  

[cpp] view plain copy

 

  1. mkdir solution & cd solution  

[cpp] view plain copy

 

  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

点击打开链接

时间: 2024-10-26 06:02:07

windwos grpc 编译的相关文章

vs2015编译使用GRPC

1.获取源码:位于github上 电脑装有git的直接克隆,未装git下载压缩包也可以 git clone  https://github.com/grpc/grpc.git cd grpc git submodule update --init  这条命令在我电脑上不起作用,我采用的办法是,对着grpc文件夹点击鼠标右键,选择 [tortoiseGit]->选择[更新子模块],如果没有安装Git可以点开github上grpc\third_party目录,可以看到grpc外部链接的子模块的地址,

android 的NDK在Windwos环境搭建

NDK的Windwos环境搭建Eclipse版本是3.6以上的    一.下载android NDK您可以下载NDK r4  for Windows或NDK r5  for Windows安装包,下载地址:地址:http://developer.android.com/sdk/ndk/index.html   下载后解压缩到你的工作目录,例如:E:\Android\tools\android-ndk-r7,结果如下图:   Android NDK包含build.docs.samples.sour

Grpc-java MacOS编译

系统版本: Mac OS X 10 本文简述grpc-java的编译过程,在官方文档的步骤里,增加两个包的安装依赖. Build # download source code git clone https://github.com/grpc/grpc-java.git cd grpc-java # install mvn brew install maven # build netty git submodule update --init cd lib/netty mvn install -

开源RPC(gRPC/Thrift)框架性能评测

海量互联网业务系统只能依赖分布式架构来解决,而分布式开发的基石则是RPC:本文主要针对两个开源的RPC框架(gRPC. Apache Thrift),以及配合GoLang.C++两个开发语言进行性能对比分析.C++.Thrift都是比较成熟的技术,先简单介绍一下GoLang以及gRPC:   GoLang Go语言是由Google开发的一个开源项目,目的之一为了提高开发人员的编程效率. Go语言语法灵活.简洁.清晰.高效.它对的并发特性可以方便地用于多核处理器 和网络开发,同时灵活新颖的类型系统

TCPMP编译方法

      本文主要讲解TCPMP播放器到WINDOWS CE平台的移植编译过程,硬件平台以ARMV4为主,结束部分会讲解到ARMV4I编译中需要注意的问题       这几天为公司一个项目做准备,准备编译移植来自linux系统的超级开源媒体播放器TCPMP(商业版名称:The Core Player)到Windwos CE平台,tcpmp是目前支持最多可以用在嵌入式设备中多媒体播放器.除了rm,rmvb等少数几种格式不支持外,其它常见视.音频格式几乎都支持.好东西是好定西,可是编译起来十分麻烦

使用VS2015编译grpc_1.3.1

环境: win7_x64,VS2015 开始: 一.安装工具 1. 安装cmake 2. 安装ActivePerl 3. 安装golang 4. 安装nasm 验证安装是否安装成功: cmake -version perl -version go version nasm -v 如果出现错误,请检查是否安装成功:若安装成功,则需要检查安装目录是否添加到环境变量path中. 二.下载源码 1. grpc-1.3.1.tar.gz 解压到D:/grpc-1.3.1 2. benchmark-1.1.

grpc(2):Centos 安装 nghttp2 做 grpc 的http2 代理

1,nghttp2 和nginx 名字比较像,但是是一个c的llib库.本身也可做http服务. 也可以做代理服务器,支持ssl. 之前也做过测试了 http://blog.csdn.net/freewebsys/article/details/58584294 因为nginx 是不支持 upstream 的http2 转发请求的. 而且nginx 也没有计划开发这个. 而haproxy 是支持 tcp 做代理的.对http2 的协议也是不支持的. 以后还打算做一个 grpc的网关. 必须要能支

Android上使用grpc的方法教程

前言 最近的一个项目使用到了grpc实现跨平台的远程调用,在安卓端使用的时候遇到了一些坑,这里记录一下. 首先根据grpc android的官方Demo配置grpc依赖,测试它的hello world工程. 编译谷歌官方的helloworld工程 添加rotobuf-gradle-plugin插件 首先添加rotobuf-gradle-plugin插件,他是用来从proto文件自动生成java代码的: //Project的build.gradle中添加rotobuf-gradle-plugin插

xcode-学习objective-c 基础教程遇到问题 例题03.06 word-length-3 编译出错

问题描述 学习objective-c 基础教程遇到问题 例题03.06 word-length-3 编译出错 #import int main(int argc, const char * argv[]) { FILE *wordFile = fopen ("/tmp/words.txt", "r"); char word[100]; while (fgets(*word,99,wordFile)) \这一行编译出现"Thread 1:EXC_BAD_AC