目录

一、概述

二、编译gRPC

三、C#中使用gRPC

四、C++中使用gRPC

无论通过哪种语言调用gRPC,都必须要编译gRPC,因为生成proto访问类时,除了产生标准的数据定义类之外,还需要产生客户端代理类。客户端代理类必须由gRPC的各个语言的protoc插件来完成。而这些插件需要在gRPC编译后才能编译生成。

下面我们一步步的来说明如何得到gRPC。

获取gRPC源码

gRPC是开源框架,项目代码在github上,所以首先要安装github。

github安装后,在指定文件夹中,执行git命令就可以获取gRPC的所有源码。

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

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

获取gRPC的依赖组件

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

git submodule init

编译gRPC

由于对其他编译工具不熟,我暂时用vs2013编译。编译过程出现的问题很多。

编译gpr,通过

编译grpc,出现错误 illegal use of this type as an expression

我查找网上的资源,原来是C语言的不允许随时定义变量,所有定义的变量都只能放在函数开头,这也是C和C++的重要区别。

将原来的

static grpc_lb_policy *create_pick_first(grpc_lb_policy_factory *factory,
grpc_lb_policy_args *args) {
if (args->num_subchannels == 0) return NULL;
pick_first_lb_policy* p = gpr_malloc(sizeof(*p));
memset(p, 0, sizeof(*p));

改为:

static pick_first_lb_policy *p;
static grpc_lb_policy *create_pick_first(grpc_lb_policy_factory *factory,
grpc_lb_policy_args *args) {
if (args->num_subchannels == 0) return NULL;
p = gpr_malloc(sizeof(*p));
memset(p, 0, sizeof(*p));

就编译通过了

编译boringssl,出现很多错误

主要是

1>D:\Projects_Framework\grpc\vsprojects\..\src\boringssl\err_data.c(17): fatal error C1083: Cannot open include file: 'openssl/base.h': No such file or directory`

我做了三种尝试

  • 使用grpc的boringssl项目

问题:找不到openssl的头文件,解决:在boringssl的vs项目中添加third_party的boringssl的头文件引用

问题:D:\Projects_Framework\grpc\vsprojects\..\third_party\boringssl\crypto\asn1\t_pkey.c': No such file or directory

问题:有很多重定义。解决:在头文件引用中去掉openssl的package依赖,原因可能是openssl的package和third_party的openssl重复

但是仍然无法编译通过

  • 不使用grpc的boringssl项目,而直接使用cmake生成boringssl的vsproj。

需要perl、go、yasm支持

perl安装即可

golang安装即可

yasm是一个可执行的exe,没有安装,在cmake中点击advanced,在CMAKE_ASM_NASM_COMPILER中设置路径。

但是我看在boringssl的文档里,说boringssl不能在windows的visual studio编译。只能用ninja编译。

但有考虑gRPC的vs项目中boringssl不仅仅是boringssl原始的项目文件,还有一个gRPC自己添加的文件,即使编译通过,也无法再grpc使用,所以就没具体没尝试ninja方法。

  • 使用grpc的boringssl里面的py脚本

我在grpc的文件夹中发现了一个文件:src\boringssl\gen_build_yaml.py。不知道是做什么的,安装python运行这个脚本之后,生成了很多asm文件。无法生成编译结果。

经过很多尝试也没有编译成功boringssl,在gRPC的github留言板上也有人说boringssl编译不过。如果哪位朋友成功编译,请告诉我方法,不胜感激。

编译zlib

在gRPC的vs解决方案中还有一个z项目,包含了zlib依赖库,直接通过vs也编译不过。但我发现这个z项目全是zlib的文件,没有额外的文件,所以我就在gRPC的文件夹的third_party\zlib目录下单独编译zlib。

通过cmake生成zlib的vcproj项目,在vs中编译通过。

编译grpc_dll等其他项目均通过

至此,gRPC的核心组件除了boringssl全部编译通过。我担心在使用C++调用gRPC的时候由于缺少boringssl会造成编译不过,但是观察gRPC的C++ example,只是依赖了openssl,并没有依赖boringssl,具体的配置参考我的文章《C++调用gRPC》。

编译protobuffer

gRPC依赖protobuffer进行消息编码,因此需要依赖protobuffer。

protobuffer的编译方法在文档 third_party\protobuf\cmake\readme.md

使用cmake生成vs的解决方案protobuf.sln,编译通过。

编译protoc的gRPC插件

将protobuf的release文件夹拷贝到third_party\protobuf\cmake中

打开grpc_protoc_plugins.sln,编译所有项目,顺利通过。

生成protoc所有的gRPC插件

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

下面的文章会介绍如何使用这些插件。

初识google多语言通信框架gRPC系列(二)编译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系列(四)C++中使用gRPC

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

  4. go语言gRPC系列(二) - 为gRPC添加证书

    1. 前言 2. 生成自签证书 2.1 MAC生成自签证书的教程链接: 2.2 Windows生成自签证书的教程 3. 改造服务端使用自签证书 3.1 复制证书至代码下 3.2 改造代码添加证书认证 ...

  5. google多语言通信框架gRPC

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

  6. spring框架应用系列二:component-scan自动扫描注册装配

    component-scan自动扫描注册装配 本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7717331.html ...

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

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

  8. RF+Appium框架自动化测试系列一之(Mac下Appium环境搭建)万事开头难

    消失了3个月,有一段时间没来园子更新博客了,各位看官见谅哈哈,消失是因为刚换了工作环境没外网,好多笔记没能及时的记录分享,以后有时间慢慢补上吧,这段时间主要接触了移动端app的自动化测试,公司为了快速 ...

  9. 微服务系列(二)GRPC的介绍与安装

    微服务系列(二)GRPC的介绍与安装 1.GPRC简介 GRPC是Google公司基于Protobuf开发的跨语言的开源RPC框架.GRPC基于HTTP/2协议设计,可以基于一个HTTP/2链接提供多 ...

随机推荐

  1. 学习笔记之TCP/IP协议分层与OSI參考模型

    1.协议的分层      ISO在制定标准化OSI之前,对网络体系结构相关的问题进行了充分的讨论, 终于提出了作为通信协议设计指标的OSI參考模型.这一模型将通信协议中必要 的功能分成了7层.通过这些 ...

  2. ExtJs4 笔记(7) Ext.tip.ToolTip 提示

    本篇介绍提示控件,ExtJs支持两种方式定义提示,可以支持普通html元素和一般的ExtJs UI控件. 一.基本提示 Ext.tip.ToolTip 1.最简单的提示 下面通过代码定义一个最简单的提 ...

  3. 《c陷阱与缺陷》笔记--注意边界值

    如果要自己实现一个获取绝对值的函数,应该都没有问题,我这边也自己写了一个: void myabs(int i){ if(i>=0){ printf("%d\n",i); }e ...

  4. [C#基础] 继承

    虚方法和覆写方法 虚方法可以使基类的引用访问"升至"派生类中 可以使用基类引用调用派生类的方法,只需满足下面的条件 派生类的方法和基类的方法有相同的签名和返回类型 基类的方法使用v ...

  5. 简单的Ajax应用实例

    从网页前端输入提示范围内的字符,然后显示从后台返回的结果 <html> <head> <meta http-equiv="content-type" ...

  6. 算法 《秦九韶算法java实践》

    [历史背景] 秦九韶算法是中国南宋时期的数学家秦九韶表述求解一元高次多项式的值的算法--正负开方术.它也能够配合牛顿法用来求解一元高次多项式的根.在西方被称作霍纳算法(Horner algorithm ...

  7. linux查找文件或字符串的命令

    1. linux下面用于查到的命令有哪些? 是不是有很多呀,这个我还没做过统计和调查,不过这篇博客只介绍grep与find的最基本应用. grep和find功能都是相当的强大,这里也只是介绍这两个命令 ...

  8. jconsole 连接 eclipse启动项目

    eclipse 启动java项目默认没有开启jmx远程查看功能,假设须要看项目执行的线程内存使用量等信息,能够在eclipse启动參数中添加: -Dcom.sun.management.jmxremo ...

  9. C Coding Standard

    1 共同 Rule 1 编译的Warnings不能被忽略掉 Rule 2 在已有Code或者三方的code基础上的改动,同意使用原来的coding standard Rule 3 假设同意C和C++都 ...

  10. JavaScript 中的事件类型1(读书笔记思维导图)

    Web 浏览器中可能发生的事件有很多类型.如前所述,不同的事件类型具有不同的信息,而“ DOM3级事件”规定了以下几类事件. UI(User Interface,用户界面)事件:当用户与页面上的元素交 ...