windows系统c++/VS2019编译gRPC
Windows下编译grpc+VS2019并编写简单的helloworld示例
导语: 本文记录了开源通信框架grpc在windows系统上编译的过程,以及使用VS 2019配置使用编译出来的grpc相关成果物展示demo.在window下编译grpc也是无奈啊,试过好多种办法(通过msys配置等),都不能为VS所用,所以只能开启一段旅程。 网上相关资料也有很多,这里基于grpc 和 VS 最新版本丰富下细节,做一下记录。
Step-1: 编译grpc
1-1 准备编译环境
(1) 安装Git
作用:下载grpc代码以及相关的第三方库代码。
参考:https://git-scm.com/
(2) 安装CMake
作用:用来编译
参考:https://cmake.org/download/
备注:将Cmake bin 目录配置到系统环境变量Path。
(3) 安装Perl
作用:grpc依赖的第三方库依赖的包。
参考:安装配置perl
安装过程中可能出现:internal error2503/2502错误
参考:***** 即可解决
(4) 安装Go
作用:grpc依赖的第三方库依赖的包。
参考:安装配置Go
(5) 安装yasm
作用:grpc依赖的第三方库依赖的包。
参考:安装配置yasm
备注:将vsyasm.exe所在目录配置到系统环境变量Path。
(6) 安装ninja
作用:grpc依赖的第三方库依赖的包。
参考:安装配置ninja
备注:将ninja.exe所在目录配置到系统环境变量Path。
这里面 perl go yasm ninja 可以用通过Choco(windows上的包管理工具安装),但是不推荐,除非你有梯子
如果大家不想折腾可以下载我搞好的:源码下载
1-2 下载grpc源码以及第三方依赖库源码
(1) 网速快或者有梯子的情况下,git bash下直接执行如下命令,然后耐心等待就可以了。
git clone https://github.com/grpc/grpc.git
cd grpc
git submodule update --init
git submodule update --init --recursive //确保库下载完全
cd third_party
git submodule update --init --recursive
执行过程中可能出现:error: RPC failed; curl 56 OpenSSL SSL_read: Connection was reset, errno
错误。
这是因为服务器的SSL证书没有经过第三方机构的签署,所以才报错
解决办法:
git config --global http.sslVerify "false"
(2) 网速慢的情况下,git bash下直接执行如下命令
git clone https://gitclone.com/github.com/grpc/grpc.git
git submodule update --init
执行完上述命令,可能会卡住,别慌Ctrl+C退出即可。
cd third_party/
git clone https://gitclone.com/github.com/abseil/abseil-cpp.git
git clone https://gitclone.com/github.com/google/benchmark.git
git clone https://gitclone.com/github.com/google/bloaty.git
git clone https://gitclone.com/github.com/google/boringssl.git
git clone https://gitclone.com/github.com/c-ares/c-ares.git
git clone https://gitclone.com/github.com/envoyproxy/data-plane-api.git
git clone https://gitclone.com/github.com/gflags/gflags.git
git clone https://gitclone.com/github.com/googleapis/googleapis.git
git clone https://gitclone.com/github.com/google/googletest.git
git clone https://gitclone.com/github.com/libuv/libuv.git
git clone https://gitclone.com/github.com/google/protobuf.git
git clone https://gitclone.com/github.com/envoyproxy/protoc-gen-validate.git
git clone https://gitclone.com/github.com/cncf/udpa.git
git clone https://gitclone.com/github.com/madler/zlib.git
如果个别库还是下载不下来,可以上github上用新的git url下载,或者直接下载代码包解压到相依目录。
注意下载完第三方库的源码后,有些目录需要调整到执行完git submodule update --init 一致的要求,否则Cmake的时候路径不对,例如:boringssl- -> boringssl-with-bazel /c-ares -->/cares/cares data-plane-api --> envoy-api
1-3 编译
(1) 修改编译脚本错误
由于历史原因,请更改grpc/cmake/ssl.cmake
set(_gRPC_SSL_INCLUDE_DIR ${BORINGSSL_ROOT_DIR}/src/include) --> set(_gRPC_SSL_INCLUDE_DIR ${BORINGSSL_ROOT_DIR}/include)
(2) 查询 cmake 支持的 VS 版本
cmake -G
(3) 修改 /grpc/third_party/zlib/gzguts.h
#ifdef _WIN32
# include <stddef.h>
#pragma warning(disable:4996) // add this line
#endif
(4) 编译
lunch cmd ,cd 到代码根目录,执行如下命令。
mkdir .build
cd .build
cmake .. -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=Release
如果在代码的根目录(C:\Program Files\Git\DownloadDemo\grpc.build>)执行:
cmake .. -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=Release
时报错
CMake Error at CMakeLists.txt:3767 (add_library):target "grpcpp_channelz" links to target "absl::bind_front" but the target was not found
boringssl- -> boringssl-with-bazel /c-ares -->/cares/cares data-plane-api --> envoy-api
在grpc/third_party下这六个文件夹都不为空
耐心等待编译结果, 过程中会有grpc.sln 生成,生成在grpc/.build目录下
使用vs打开,右键ALL_BUILD编译:
a:如果在编译时出现:找不到"zlib.h"的错误
解决办法:找到出错的对应项目:例如grpc项目,右键grpc项目—>选择属性—>点击c/c++,选中"常规"中的"附加包含目录项",将zlib.h的路径添加进去,比如我的在:C:\Program Files\Git\grpc\third_party\zlib,
目录下。
b:编译All_build时如果出现:将警告视为错误的问题
解决办法:找到对应项目,右键—>选择属性—>C+±–>常规—>找到将警告视为错误项,置为否。(我这是crypto出现此错误)
右键INSALL编译:(其实是安装,文件会保存到C:\Program Files (x86)/grpc, 可能会没权限,使用管理员方式打开vs,之后再重复上面的动作安装即可)
grpc相关lib 主要在.build/Release/目录下
第三方lib 主要在.build/third_party/xxxx/Release/
到这里已经编译完成了。 下面开始编译helloworld示例
- 使用vs2019新建立一个空的c++ console project,这里我使用Release模式编译.
- 拷贝文件:
helloworld.proto 可以从 grpc\examples\protos
下获取
greeter_server.cc和greeter_client.cc 可以从grpc\examples\cpp\helloworld
目录下获取。
grpc_cpp_plugin.exe可以从grpc\.build\Release
中获取
protoc.exe和zlib.dll可以从C:\Program Files (x86)\grpc\bin中
获取
将上述文件全部拷贝到工程目录中,然后在VS中添加helloworld.proto、greeter_server.cc和greeter_client.cc 进创建的新项目。
- 在工程目录打开cmd控制台,执行命令编译helloworld.proto文件生成pb.*和grpc.*文件:
protoc.exe --grpc_out=. --plugin=protoc-gen-grpc=grpc_cpp_plugin.exe helloworld.proto
protoc.exe --cpp_out=. helloworld.proto
- 设置头文件目录和lib目录以及lib:
a:先添加头文件所在目录:
项目右键–> 属性–>c/c++ -->常规—>附加包含目录
C:\Program Files\Git\grpc\include
C:\Program Files\Git\grpc\third_party\protobuf\src
将这两个目录添加进去。
或者也可以在项目目录下创建一个include文件夹,将这两个文件夹下的文件拷贝到include文件夹中,
$(ProjectDir)\include
再将上述目录添加进附加包含目录
b:配置lib包含目录
项目右键–> 属性–>链接器–>常规—>附加库目录
将
C:\Program Files\Git\grpc\.build\third_party\cares\cares\lib\Release // 中的cares.lib
C:\Program Files\Git\grpc\.build\third_party\zlib\Release // 中的 zlib.lib
C:\Program Files\Git\grpc\.build\third_party\protobuf\Release //中的libprotobuf.lib
C:\Program Files\Git\grpc\.build\Release //中的address_sorting.lib、grpc.lib、grpc++.lib、gpr.lib和grpc++_reflection.lib
添加到附加目录库。(或者在项目目录创建lib文件夹,将上述.lib文件拷贝到lib文件夹,在附加目录库中只需添加$(ProjectDir)\lib)
下列是我创建的lib文件中的文件,由于本人比较懒,直接全选拷贝过来的,存在一些无用的库,仅供参考
c:配置lib 项目名称
项目右键–> 属性–>链接器–>常规—>输入—>附加依赖项
下列是需要添加的lib库
libprotobuf.lib
grpc.lib
grpc++.lib
gpr.lib
zlib.lib
cares.lib
grpc++_reflection.lib
address_sorting.lib
Ws2_32.lib
d:预处理增加_WIN32_WINNT=0x0A00
项目右键–> 属性–>c/c++ -->预处理器—>预处理定义
5.编译2次生成server,client的exe。第一次把greeter_client.cc中的 main函数注释掉。
第二次释放第一次在greeter_client.cc中注释的main函数,将greeter_server.cc里面的main函数注释掉。一个工程只能有一个main函数。
在编译客户端时,需要在greeter_client.cc中添加下列语句
std::cin.get();//防止客户端一闪而过
6.最后生成exe文件,这里我改了名字:(运行需要将两个.exe文件和zlib.dll放在同一个目录)
7.运行server,再运行client
执行成功
windows系统c++/VS2019编译gRPC相关推荐
- ViSP安装之Windows系统基于VS2019编译器编译获得VISP动态库
Windows系统基于VS2019编译器编译获得VISP动态库 官网地址: Installation from source for Windows with Visual C++ 2019 (vc1 ...
- Windows系统C++配置编译OpenCV
Windows系统C++配置编译OpenCV 前言 首先是下载OPENCV, 下载并安装CMAKE 下载并安装mingw和gcc 可选.安装QT 使用CMAKE生成GCC和QT配置文件 需要一个好用的 ...
- FFmpeg在Windows系统下的编译过程
由于FFMpeg是基于Linux开发的开源项目,源代码和Windows下最常见的Visual Studio提供的C/C++编译器不兼容,因此它不能使用MSVC++编译.要想使用FFMpeg,最先要解决 ...
- Windows下使用VS2019编译libiconv-1.16
Windows下使用VS2019编译libiconv-1.16 参考了 https://blog.csdn.net/zhouguangcai8/article/details/105270657,在其 ...
- 在Windows和Linux上编译gRPC源码操作步骤(C++)
gRPC最新发布版本为v1.23.0,下面以此版本为例说明在Windows和Linux下编译过程. Windows7/10 vs2103编译gRPC源码操作步骤: 1. 需要本机已安装Git.CMak ...
- windows系统下_ffmpeg编译_2011年
ffmpeg开源库在linux系统下弄的,是一个很全的音频和视频的编解码库要在windows下编译出用于开发的lib库确实比linux下要麻烦,百度了很久,参照别人的见解终于成功编译出自己需要的可以用 ...
- Windows10系统中用VS2019编译live555
一.Win10(64位)系统中,首先下载live555源码: live555下载地址:http://www.live555.com/liveMedia/public/ 其中264文件夹下是264格式的 ...
- ffmpeg 2.6.3在Windows系统MinGW的编译
本文应网友要求而写,目标:在Windows 7操作系统中搭建MinGW环境,编译ffmpeg. 一.准备环境 1.MinGW 1).到http://www.mingw.org/(实际下载地址为http ...
- 在Windows下使用vs2019编译libjpeg库
一.库的编译 1.下载 libjpeg 源码,这里我下载的是 jpegsr9e.zip 2.解压源码 3.进入解压后的目录,找到 makefile.vs 文件,用文本编辑器打开并编辑,找到 语句 #! ...
- windows 10下VS2019编译mongoDB c、c++API(win10下vs2019编译mongo c++)
1.windows 10下安装 git git clone https://github.com/mongodb/mongo-c-driver.git 拖到本地,然后mkdir cmake_build ...
最新文章
- [编程题]字符串最后一个单词的长度
- 折腾Java设计模式之建造者模式
- Linux基础常用运维操作
- 实现物体绕不同轴旋转,并可以外部调用的函数
- springmvc 中文文档
- 将Vue+Nodejs项目部署到阿里云服务器
- VBA and Access
- 使用Enterprise Architecture绘制10种UML画画
- VB用API控制输入法状态
- 【软考】数据库系统工程师备考指南(一)
- 电商峰值系统架构设计--转载
- 完美简单的集成高德地图导航和语音播报功能
- 关于为什么不能减小rb来消除截止失真
- 华为HCIP-DATACOM391-420(821)
- 爬取网易云音乐评论2
- 做有责任的企业!拉卡拉获“2018年度责任品牌奖”
- Typora常用快捷键(详细)
- 【超全】一文详解机器学习特征工程(附代码)
- java后台 学习顺序
- TM4C123-Peripheral Driver Library
热门文章
- python舞蹈链数独游戏
- Linux下的摄相头驱动
- OpenCV 实现读取摄像头、视频读取保存 (C++)
- html 图片垂直边距,HTML,CSS和垂直文本边距
- 游戏设计的艺术:一本透镜的书——第十九章 世界包含着各种空间
- PAT乙级真题 1092 最好吃的月饼 C++实现
- 遇到“无法浏览网页”教你十招解决疑难杂症
- 媒体查询@media
- 程序员容易发福的原因及解决办法
- .net C# asp.net SMTP 匿名发邮件完整解决方案,有源码.