编译gRPC

编译gRPC

目录

一、概述

二、编译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

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

时间: 2024-10-25 20:10:33

编译gRPC的相关文章

Windows上编译GRPC

Windows上源码编译多数开源软件都很麻烦 编译环境:VS2015(grpc支持2013及以上,2012上没有Nuget,编译起来要费劲的多) 编译GRPC涉及内容 grpc protobuf grpc_protoc_plugin(本文以c++语言为编译目标,因此只涉及grpc_cpp_plugin) zlib grpc代码下载后,执行git submodule update --init初始化依赖的submodule 1. protobuf 参考readme用CMAKE生成工程文件,编译即可

编译gRPC Go版本使用的 ProtoBuffer 文件

本篇文章主要解决mac下安装ProtoBuffer,编译go版本gRPC用的.proto文件 安装 protoc 注意,gRPC 需要用到 proto3, 而目前 Release 的版本是 2.6.1, 所以我们需要去下载源码并编译. https://developers.google.com/protocol-buffers/docs/downloads?hl=zh-cn protobuf 的源码在: https://github.com/google/protobuf Mac的特有前置安装需

Visual Studio自动编译gRPC工程的设置

前段时间研究一个java程序,增加一些功能.其中用到java和C#的通信.自然,有多种办法,后来实际上是用javascript调用C#的REST WCF服务实现的.但是在查资料的过程中,发现有个Protocol Buffers的东东,Google开发的,也可以用.出于好奇,试了下.Java那头用Maven编译,C#这头,可用MSBuild编译,但需要做些配置. 假设工程中有这些文件:test.proto,testClient.cs(调用gRPC客户端),希望按一下F5就编译好,怎么做呢? 1.

CMake方式编译grpc

首先,下载 grpc 源代码到本地: git clone https://github.com/grpc/grpc.git 如果只想下载指定版本的,如以版本"1.27.3"为例,可改成如下语句: git clone -b v1.27.3 https://github.com/grpc/grpc.git 上列操作成功完成后,grpc 源码的第三方依赖目录 third_party 实际是空的,需通过下列步骤拉取依赖的第三方.切换到 grpc 目录,下载 grpc 第三方依赖到本地: git

C#中使用gRPC

C#中使用gRPC 我的这几篇文章都是使用gRPC的example,不是直接编译example,而是新建一个项目,从添加依赖,编译example代码,执行example.这样做可以为我们创建自己的项目提供借鉴.如果对gRPC构建应用很熟悉,可以无视本系列文章. 目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 由于有NuGet,使得C#在配置项目时非常简单. 1. 在NuGet中添加ProtocolBuffer和gRPC引用 protocol buffer 3.

google多语言通信框架gRPC

google多语言通信框架gRPC系列(一)概述 gRPC概述 3/26/2016 9:16:08 AM 目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 一直在寻找多平台多语言的通信框架,微软的WCF框架很强大和灵活,虽然也能通过自定义绑定和其他技术的客户端通信,但是始终没有实现多平台的技术框架的统一.google的gRPC是一个不错的选择,相比于类似框架Thrift等,google的解决方案更成熟和通用.不足的是由于刚刚开源,使用范围有限,国内资料更少.例如

从Protocol Buffers 到 gRPC

从Protocol Buffers 到 gRPC 我们项目中准备使用Protocol Buffers来进行服务器和客户端的消息交互,采用gRPC开源框架,服务器使用Java,客户端有Android和iOS. 从Protocol Buffers 到 gRPC 一Protocol Buffers 文档 使用 1 定义一个消息类型 官方例子 2 字段限制 3 Tags 4 具体使用 Protoc源码的编译以及使用 1 安装ProtocolBuffer工具 2 使用protoc编译proto文件 二gR

gRPC入坑记

概要 由于gRPC主要是谷歌开发的,由于一些已知的原因,gRPC跑demo还是不那么顺利的.单独写这一篇,主要是gRPC安装过程中的坑太多了,记录下来让大家少走弯路. 主要的坑: 如果使用PHP.Python开发gRPC的客户端,需要编译gRPC命令行工具,生成proto的代码生成插件,否则proto里定义的service无法编译出来.编译需要使用GCC4.8级以上版本,否则报不支持C++11.然后需要龟速下周grpc源码,并下载一大堆第三方依赖.这个过程非常痛苦.使用golang.java的可

Windows+VS2017使用gRPC

gRPC官方Windows安装说明: Install Visual Studio 2015 or 2017 (Visual C++ compiler will be used). Install Git. Install CMake. Install Active State Perl (choco install activeperl) - required by boringssl Install Go (choco install golang) - required by borings