初识google多语言通信框架gRPC系列(二)编译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的更多相关文章
- 初识google多语言通信框架gRPC系列(一)概述
gRPC概述 3/26/2016 9:16:08 AM 目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 一直在寻找多平台多语言的通信框架,微软的WCF框架很强大和灵 ...
- 初识google多语言通信框架gRPC系列(三)C#中使用gRPC
我的这几篇文章都是使用gRPC的example,不是直接编译example,而是新建一个项目,从添加依赖,编译example代码,执行example.这样做可以为我们创建自己的项目提供借鉴.如果对gR ...
- 初识google多语言通信框架gRPC系列(四)C++中使用gRPC
我的这几篇文章都是使用gRPC的example,不是直接编译example,而是新建一个项目,从添加依赖,编译example代码,执行example.这样做可以为我们创建自己的项目提供借鉴.如果对gR ...
- go语言gRPC系列(二) - 为gRPC添加证书
1. 前言 2. 生成自签证书 2.1 MAC生成自签证书的教程链接: 2.2 Windows生成自签证书的教程 3. 改造服务端使用自签证书 3.1 复制证书至代码下 3.2 改造代码添加证书认证 ...
- google多语言通信框架gRPC
google多语言通信框架gRPC系列(一)概述 gRPC概述 3/26/2016 9:16:08 AM 目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 一直在寻找 ...
- spring框架应用系列二:component-scan自动扫描注册装配
component-scan自动扫描注册装配 本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7717331.html ...
- Google C++单元测试框架GoogleTest(总)
之前一个月都在学习googletest框架,对googletest的文档都翻译了一遍,也都发在了之前的博客里,另外其实还有一部分的文档我没有发,就是GMock的CookBook部分:https://g ...
- RF+Appium框架自动化测试系列一之(Mac下Appium环境搭建)万事开头难
消失了3个月,有一段时间没来园子更新博客了,各位看官见谅哈哈,消失是因为刚换了工作环境没外网,好多笔记没能及时的记录分享,以后有时间慢慢补上吧,这段时间主要接触了移动端app的自动化测试,公司为了快速 ...
- 微服务系列(二)GRPC的介绍与安装
微服务系列(二)GRPC的介绍与安装 1.GPRC简介 GRPC是Google公司基于Protobuf开发的跨语言的开源RPC框架.GRPC基于HTTP/2协议设计,可以基于一个HTTP/2链接提供多 ...
随机推荐
- android使用篇(四) 注解依赖注入IOC实现绑定控件
在android使用篇(三) MVC模式中提到一个问题: 1) 视图层(View):一般採用XML文件进行界面的描写叙述,使用的时候能够很方便的引入,可是用xml编写了,又须要在Acitvity声明而 ...
- (四)SAX方式解析XML数据
SAX方式解析XML数据 文章来源:http://www.cnblogs.com/smyhvae/p/4044170.html 一.XML和Json数据的引入: 通常情况下,每个需要访问网络的应用程 ...
- Lisp的永恒之道 好文
http://www.cnblogs.com/weidagang2046/archive/2012/06/03/tao_of_lisp.html
- 使用git微命令深入理解git工作机制
首先.这篇不是真正意义上的翻译,所以大家在看的时候不要找相应的英文文章相应着看.这篇文章之所以归类为翻译.是由于最開始有一篇英文文章让我对git内部机制有了清楚的认识,它能够说是我git的启蒙老师吧. ...
- 蜘蛛侠天堂,打死我mac键盘
今天是周末,在我租住的房间,以一个离奇事件. 一个蜘蛛侠天堂,趴在我的假期车窗玻璃,爬下沿着玻璃.特别糟糕.可以飞檐走壁. 可惜体力不支,摔死在我的mac键盘上. 有图有视频. 视频链接:http:/ ...
- TControl的消息覆盖函数大全(15个WM_函数和17个CM_函数,它的WndProc就处理鼠标与键盘消息)
注意,这些函数只有Private一种形式(也就是不允许覆盖,但仍在动态表格中)(特别注意,这里居然没有WM_PAINT函数): TControl = class(TComponent) private ...
- 拆分字符串,GetHtmlByWebBrowser,UnicodeToMBCS,提升进程权限
1. // 根据字符串,拆分字符串,相当于vb中的split函数 function SplitString(const Source, ch: string): TStringList; var te ...
- ios 正則表達式替换
1. 不可变字符串 (content 是不可变) NSRegularExpression *regularExpression = [NSRegularExpression regularExpr ...
- Struts 2.x仍然明显落后于时代。 Struts 2.x这一类老牌Web MVC开发框架仅能用于开发瘦客户端应用,无法用来开发对于交互体验要求更高的应用。
后来我在工作中陆续使用过Struts 1.x和Struts 2.x.我曾经把一个开源的基于Struts 1.x的自助式广告联盟应用移植到Spring MVC,还基于Struts 2.x做过网站开发.S ...
- jsoncpp使用
第一个github网站下载jsoncpp最新的版本库:https://github.com/open-source-parsers/jsoncpp 点击右下角的Download ZIP进行下载 解压后 ...