当前位置: 首页 > news >正文

在Windows10上编译grpc工程,得到protoc.exe和grpc_cpp_plugin.exe

    grpc是google于2015年发布的一款跨进程、跨语言、开源的RPC(远程过程调用)技术。使用C/S模式,在客户端、服务端共享一个protobuf二进制数据。在点对点通信、微服务、跨语言通信等领域应用很广,下面介绍grpc在windows10上编译,这里以编译grpc v1.42.0版本为例,进行说明,如图(1)所示:

https://github.com/grpc/grpc/tree/v1.42.0/
图(1) 下载grpc v1.42.0版本

1 安装编译工具

1.1 安装VS2019

    下载VS2019,官网地址: https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/
    个人地址: https://pan.baidu.com/s/1VaQC5_CprbTtp8mbPWCaBA
提取码:uo1b
    双击该安装包,选中"使用C++的桌面开发",然后一路默认,直到安装完成。

图(2) 下载VS2019

图(3) 选中“使用C++的桌面开发”即可

1.2 安装git

    git官网: ttps://git-scm.com/
    git的安装方法进,参考这篇文件: git详细安装教程

1.3 安装cmake

    cmake官网: https://cmake.org/download/
    cmake的安装方法,参考这篇文件: cmake安装

1.4 安装nasm

    nasm官网: https://www.nasm.us/
    nasm的安装方法,参考这篇文件: nasm安装

1.5 安装ninja

    ninja官网: https://ninja-build.org/
    ninja的安装方法,参考这篇文件: ninja安装

2 配置工程

2.1 Git配置ssh

    git配置ssh请参考这篇文章: https://www.cnblogs.com/yiven/p/8465054.html

2.2 修改zlib的版本号

    将grpc\third_party\zlib\CMakeLists.txt里的第一行cmake版本号,改成如下:

cmake_minimum_required(VERSION 2.8...3.22)

2.3 下载第三方依赖包

    在https://github.com/grpc/grpc/tree/v1.42.0/third_party链接里,

https://github.com/grpc/grpc/tree/v1.42.0/third_party

    下载编译所需的第三方依赖包,具体如下:

abseil-cpp
benchmark
bloaty
boringssl
c-ares
data-plane-api
googleapis
googletest
libuv
opencensus-proto
opentelemetry-proto
protobuf
protoc-gen-validate
re2
xds
zlib

    将这些第三方依赖包下载后,解压,把它们放到grpc\third_party的同名目录里。

图(4) 手动下载第三方依赖包

    或者,在这个链接里下载: https://pan.baidu.com/s/1fplVSH39XML3pRnshFGnVA 提取码:dair

3 使用cmake编译grpc

    打开Git ,克隆grpc工程,然后,设置第三方的依赖库,再使用make命令编译。

## 1) 克隆grpc工程
git clone --recurse-submodules -b v1.42.0 https://gitee.com/mirrors/grpc## 2) 进入grpc工程
cd grpc## 3) 同步第三方模块
git submodule sync## 4)使用VS2019构建静态库
cmake -G "Visual Studio 16 2019" -DgRPC_INSTALL=ON -DgRPC_BUILD_TESTS=OFF ./CMakeLists.txt## 5) 设置Debug目录,并编译
cmake --build . --config Debug## 6) 设置Release目录,并编译
cmake --build . --config Release

4 生成protobuf文件

4.1 提取protoc

    编译成功后,在grpc\third_party\protobuf\Release目录,会看到protoc.exe、libprotoc.lib等文件;
    在grpc\Release\grpc_cpp_plugin.exe、grpc_csharp_plugin.exe,将其拷贝出来,放到D:\protobuf,如图(5)所示:

图(5) 拷贝protoc.exe、grpc_cpp_plugin.exe、grpc_csharp_plugin.exe

4.2 创建一个helloworld.proto文件

    helloworld.proto的内容如下:
    //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 greetingrpc 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;
}

4.3 生成pb文件

    按Win+R快捷键,输入:cmd,依次输入如下命令:

## 1)切换到D盘
D:## 2)进入protobuf目录
D:\protobuf## 3)执行C++方式的protoc命令
protoc.exe -I=.\ --cpp_out=.\ --grpc_out=.\ --plugin=protoc-gen-grpc=".\grpc_cpp_plugin.exe" helloworld.proto## 4) 执行Csharp方式的protoc命令
protoc.exe -I=.\ --csharp_out=.\ --grpc_out=.\ --plugin=protoc-gen-grpc=".\grpc_csharp_plugin.exe" helloworld.proto

    本例采用C++方式的protoc命令,如图(6)所示:

protoc.exe -I=.\ --cpp_out=.\ --grpc_out=.\ --plugin=protoc-gen-grpc=".\grpc_cpp_plugin.exe" helloworld.proto
图(6) 按C++方式,生成pb文件

    或按C# (CSharp)方式,生成pb文件,如图(7)所示:

图(7)按C#(CSharp)方式,生成pb文件

5 C++和C#版本的protoc

5.1 C++、C#共同的protoc

    protoc是根据插件grpc_XXX_plugin.exe和命令 --XXX_out 参数,来生成不同语言的pb文件的。protoc.exe既可以共用,也可以单独分开。这里介绍共用的protoc,如图(8)所示表示不同的插件:

图(8) grpc_XXX_plugin.exe表示不同的语言插件

    grpc通过protoc文件,进行数据传递。这里给出C++和C#版本protoc链接: https://pan.baidu.com/s/1RjUeI-89M8FkYuXDCMsMFg 提取码:s56c

    对于其他语言版本的protoc,比如Java、Note.js、Ruby、Python等版本的protoc,需要按照本文第1~4节来编译grpc源码,在grpc\Release和grpc\thitd_party\protobuf\Release目录,就可以得到protoc。

5.2 C#单独的protoc

    C#版本的protoc,在NuGet.org里有官方版本下载,它放在Grpc.Tools工具里,如图(9)所示:

https://www.nuget.org/packages/Grpc.Tools/2.57.0#show-readme-container
图(9) 下载Grpc.Tools工具,该包是C#版本的protoc包

    下载Grpc.Tools工具,得到以*.nupkg结尾的压缩包,这个*.nupkg后缀名改成*.rar,如图(10)所示:

图(10) 下载Grpc.Tools,并修改后缀名

    然后将这rar文件解压,在grpc.tools\tools\windows_x64目录下,即可看到protoc.exe、gprc_csharp_plugin.exe文件,这2个文件用于生成C#版本grpc对应的pb文件,如图(11)所示:

图(11) 在grpc.tools\tools\windows_x64里

参考文献

【1】 cmake编译grpc v1.42.0
【2】 grpc C++笔记

相关文章:

在Windows10上编译grpc工程,得到protoc.exe和grpc_cpp_plugin.exe

grpc是google于2015年发布的一款跨进程、跨语言、开源的RPC(远程过程调用)技术。使用C/S模式,在客户端、服务端共享一个protobuf二进制数据。在点对点通信、微服务、跨语言通信等领域应用很广,下面介绍grpc在windows10上编译,这里以编译grpc …...

一些测试知识

希望能起到帮助,博主主页: https://blog.csdn.net/qq_57785602/category_12023254.html?spm1001.2014.3001.5482 软件测试理论 测试的依据: 需求,规格说明,模型,用户需求等 什么是软件测试 描述一种来…...

Socket交互的基本流程?

TCP socket通信过程图 什么是网络编程,网络编程就是编写程序使两台连联网的计算机相互交换数据。怎么交换数据呢?操作系统提供了“套接字”(socket)的组件我们基于这个组件进行网络通信开发。tcp套接字工作流程都以“打电话”来生…...

css 分割线中间带文字

效果图 代码块&#xff08;自适应&#xff09; <div class"line"><span class"text">我是文字</span></div>.line{height:0;border-top:1px solid #000;text-align:center;}.text{position:relative;top:-14px;background-color:#…...

会不会激发对modern c++的新兴趣

可变参数好像很厉害的样子&#xff0c;会节省很多手写代码&#xff0c;让编译器自动帮我们生成代码 template<typename Fun, typename...Args> void invoke(Fun&& fun, Args&&...args) { fun(std::forward<Args>(args)...); } 任意函数包装器…...

Nginx服务器如何配合Java开发项目

Nginx服务器如何才能配合好相关的编程语言进行服务器搭建呢&#xff1f;下面我们就来看看有关的技术如何融合。希望大家有所收获。 在进行Nginx服务器建设的时候有很多语言的应用&#xff0c;其中Java 开发的web项目就是很常见的。下面我们就看看Nginx服务器如何才能与Java编程…...

【LeetCode-中等题】994. 腐烂的橘子

文章目录 题目方法一&#xff1a;bfs层序遍历 题目 该题值推荐用bfs&#xff0c;因为是一层一层的感染&#xff0c;而不是一条线走到底的那种&#xff0c;所以深度优先搜索不适合 方法一&#xff1a;bfs层序遍历 广度优先搜索&#xff0c;就是从起点出发&#xff0c;每次都尝…...

K8s部署单机mysql

文章目录 一、K8s部署单机mysql1.1 说明1.2 不足 二、部署三、检查 一、K8s部署单机mysql 1.1 说明 定制配置数据存放在configMapmysql数据放在/opt/mysql目录下(/opt/mysql目录需要事先创建)root账号密码使用环境变量env服务暴露方式为nodePort&#xff0c;端口30336 1.2 不…...

Midjourney学习(二)参数的基础

prompt的组成 prompt 可以由三部分组成&#xff0c; 第一部分是垫图部分&#xff0c;也就是一张网络图片 第二部分是文本描述内容 第三部分则是参数 参数列表 --aspect <value> 或者 --ar <value> 控制画面的比例&#xff0c;横竖比例 --version <value> -…...

Ubuntu安装Protobuf,指定版本

参考&#xff1a;https://github.com/protocolbuffers/protobuf#readme https://github.com/protocolbuffers/protobuf/blob/v3.20.3/src/README.md 其实官网的readme给的步骤很详细。 1.安装相关依赖 sudo apt-get install autoconf automake libtool curl make g unzip …...

没有使用sniffer dongle在windows抓包蓝牙方法分享

网上很多文章都是介绍买一个sniffer dongle来抓蓝牙数据,嫌麻烦又费钱,目前找到一个好方法,不需要sniffer就可以抓蓝牙数据过程,现分享如下: (1)在我资源附件找到相关安装包或者查看如下链接 https://learn.microsoft.com/zh-cn/windows-hardware/drivers/bluetooth/testing-bt…...

解决Debian系统通过cifs挂载smb后,中文目录乱码问题

解决Debian系统通过cifs挂载smb后&#xff0c;中文目录乱码问题 //$smb_server/share /mnt/nas_share cifs credentials/root/.smbcredentials,iocharsetutf8 0 0默认通过以上命令挂载smb&#xff0c;但是在查看文件目录时&#xff0c;中文乱码 解决问题方式&#xff1a; de…...

springboot整合jquery实现前后端数据交互

一 实施逻辑 1.1 前端 <!doctype html> <html lang"en"><head><meta charset"UTF-8"><meta name"Generator" content"EditPlus"><meta name"Author" content""><meta n…...

TypeScript 中的类型检查实用函数

TypeScript 中的类型检查实用函数 文章目录 TypeScript 中的类型检查实用函数一、概述二、代码实现 一、概述 在前端开发中&#xff0c;我们经常需要判断变量的类型以进行相应的操作或处理。TypeScript 提供了基础的类型检查&#xff0c;但有时我们需要更复杂或更灵活的类型检…...

JavaScript中的事件委托(event delegation)

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ JavaScript事件委托⭐ 事件冒泡&#xff08;Event Bubbling&#xff09;⭐ 事件委托的优点⭐ 如何使用事件委托⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启…...

ubuntu OCR 脚本

1. 百度 PaddleOCR 介绍 2. 环境安装 pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple # 进入 https://github.com/PaddlePaddle/PaddleOCR # 这里有个 requirements.txt pip install paddleocr -i https://mirror.baidu.com/pypi/simple pip instal…...

Go死码消除

概念: 死码消除(dead code elimination, DCE) 是一种编译器优化技术, 作用是在编译阶段去掉对程序运行结果没有任何影响的代码 和 逃逸分析[1],内联优化[2]并称为 Go编译器执行的三个重要优化 效果: 对于 const.go代码如下: package mainimport "fmt"func max(a, b i…...

基于改进莱维飞行和混沌映射的粒子群优化BP神经网络分类研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

12. 自动化项目实战

目录 1. 登录测试 2. 测试首页的帖子列表数不为0 3. 帖子详情页校验 4. 发布帖子 5. 退出登录 自动化项目实施的基本流程如下图所示&#xff1a; 手工测试用例、自动化测试用例。 1. 登录测试 校验登录后主页显示的用户名称和登录时输入的用户名是否相等。 public class…...

Window11下载安装jdk8-jdk11与环境变量的配置

目录 一、下载jdk 二、安装jdk 三、配置环境变量 四、检查JDK是否配置成功 一、下载jdk jdk8下载链接&#xff1a;请点击网址 jdk11下载链接&#xff1a;请点击网址 二、安装jdk 按照提示一步一步安装即可。 默认安装位置&#xff1a;C:\Program Files\Java 三、配置…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...