热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在Ubuntu20.04环境下安装GRPC

由于工作项目中涉及GRPC,因此需要安装GRPC和PROTOC以及编译proto文件。特此记录自己安装与编译的整个过程和注意点。一、解决虚拟机使用上的小问题这一部




由于工作项目中涉及GRPC,因此需要安装GRPC和PROTOC以及编译proto文件。特此记录自己安装与编译的整个过程和注意点。


一、解决虚拟机使用上的小问题

这一部分对安装GRPC没有特别的影响,如果自己的虚拟机存在这些使用不便的问题并且想解决,可以看看,如果不需要的话跳过这一部分就好了。


1、实现全屏显示及与windows之间的文件拖放

命令如下:

更新package:
sudo apt update
安装open-vm-tools-desktop,主要实现主机与虚拟机之间的复制粘贴包括文件拖放:
sudo apt-get install open-vm-tools-desktop
重启:
sudo reboot
安装成功后即可全屏显示与拖放文件

2、解决使用vi/vim编辑文件时方向键、退格键使用异常的问题

命令如下:

ubuntu预装的是vim tiny版本,而需要的是vim full版本。执行下面的语句安装vim full版本:
删除组件包vim-common:
sudo apt-get remove vim-common
安装文本编辑器:
sudo apt-get install vim

在这里插入图片描述


二、安装GRPC

GRPC可以完成跨语言之间的通信,它是一种协议。我们可以通过在proto文件中定义数据结构和接口函数来实现数据传输。


1、使用cmake --version先查看camke版本

在我第一次安装GRPC时,根据官方教程安装了推荐版本的cmake,但后续不知道什么原因导致没有成功安装GRPC。通过实践,我发现也许需要3.22.3及更高版本的cmake,所以为了保险起见,还是安装3.22.3版本的cmake。

可进入https://github.com/Kitware/CMake/releases自行下载,我选择的是 cmake-3.22.3-linux-x86_64.sh
放入虚拟机后更名为cmake-linux.sh(右键更改文件名)
运行cmake-linux.sh文件,通过脚本在本地目录安装更新的cmake版本,--skip-license安装时不会要求用户进行许可协议确认,--prefix=$MY_INSTALL_DIR 配置安装的路径:
sudo sh cmake-linux.sh -- --skip-license --prefix=$MY_INSTALL_DIR
查看cmake是否安装成功:cmake --version


2、安装构建grpc所需的基本工具

安装build-essential、autoconf 、libtool 、pkg-config:
##build-essential作用是提供编译程序必须软件包的列表信息,这样编译程序才知道头文件和库函数在哪,才会下载依赖的软件包
##autoconf是一种生成shell脚本的工具,可以自动配置软件源代码包
##libtool是自动生成并调用动态库的工具,包装了gcc或者其他编译器
##pkg-config提供功能:检查库的版本号;获得编译预处理参数,如宏定义、头文件的位置; 获得链接参数,如库及依赖的其他库的位置,文件名及其他一些链接参数;自动加入所依赖的其他库的设置。

命令如下:

更新package:
sudo apt update
安装所需库:
sudo apt-get install build-essential autoconf libtool pkg-config


3、克隆grpc存储库

命令如下:

安装git:
sudo apt install git
克隆存储库:
git clone -b v1.28.x https://gitee.com/slrom/grpc

4、下载grpc子模块的代码

这里需要注意的是,由于github访问不稳定,所以我们可以修改 grpc目录下的.gitmodules文件中各子模块的地址,便于更好下载子模块的代码

.gitmodules文件这样修改:

[submodule "third_party/zlib"]
path = third_party/zlib
url = https://gitee.com/slrom/zlib.git
# When using CMake to build, the zlib submodule ends up with a
# generated file that makes Git consider the submodule dirty. This
# state can be ignored for day-to-day development on gRPC.
ignore = dirty
[submodule "third_party/protobuf"]
path = third_party/protobuf
url = https://gitee.com/slrom/protobuf.git
branch = 3.0.x
[submodule "third_party/gflags"]
path = third_party/gflags
url = https://gitee.com/slrom/gflags.git
[submodule "third_party/googletest"]
path = third_party/googletest
url = https://gitee.com/slrom/googletest.git
[submodule "third_party/benchmark"]
path = third_party/benchmark
url = https://gitee.com/slrom/benchmark.git
[submodule "third_party/boringssl-with-bazel"]
path = third_party/boringssl-with-bazel
url = https://gitee.com/slrom/boringssl.git
[submodule "third_party/boringssl"]
path = third_party/boringssl
url = https://gitee.com/slrom/boringssl.git
[submodule "third_party/cares/cares"]
path = third_party/cares/cares
url = https://gitee.com/slrom/c-ares.git
branch = cares-1_12_0
[submodule "third_party/bloaty"]
path = third_party/bloaty
url = https://gitee.com/slrom/bloaty.git
[submodule "third_party/abseil-cpp"]
path = third_party/abseil-cpp
url = https://gitee.com/slrom/abseil-cpp.git
branch = lts_2020_02_25
[submodule "third_party/envoy-api"]
path = third_party/envoy-api
url = https://gitee.com/slrom/data-plane-api.git
[submodule "third_party/googleapis"]
path = third_party/googleapis
url = https://gitee.com/slrom/googleapis.git
[submodule "third_party/protoc-gen-validate"]
path = third_party/protoc-gen-validate
url = https://gitee.com/slrom/protoc-gen-validate.git
[submodule "third_party/udpa"]
path = third_party/udpa
url = https://gitee.com/slrom/udpa.git
[submodule "third_party/libuv"]
path = third_party/libuv
url = https://gitee.com/slrom/libuv.git
[submodule "third_party/libcxx"]
path = third_party/libcxx
url = https://gitee.com/slrom/libcxx.git
[submodule "third_party/libcxxabi"]
path = third_party/libcxxabi
url = https://gitee.com/slrom/libcxxabi.git

完成文件修改后,命令如下:

下载子模块的代码
到达grpc目录下:
cd grpc
根据.gitmodules文件中的路径访问相应子模块并下载:
git submodule update --init


5、构建和安装grpc和protocol buffers

命令如下:

到达grpc目录下:
cd grpc
若该文件夹不存在则创建文件夹:
mkdir -p cmake/build
到达cmake/build目录下:
cd cmake/build
编译构建依赖库,通过cmake安装grpc,设置-DgRPC_INSTALL=ON,-DgRPC_BUILD_TESTS=OFF;构建安装路径,通过CMAKE_INSTALL_PREFIX变量指定;想要编译动态库.so文件,设置-DBUILD_SHARED_LIBS=ON:
cmake -DgRPC_INSTALL=ON \
-DgRPC_BUILD_TESTS=OFF \
-DCMAKE_INSTALL_PREFIX=/usr/ \
-DBUILD_SHARED_LIBS=ON \
../..
编译:
make -j16
安装:
sudo make install

三、测试

按照以上步骤,安装就基本完成了,但还是添加一步简单的测试验证下是否安装成功,如需要使用不是GRPC中自带的例子完成测试的话,可以去看看GRPC的官方教程。
命令如下:

cd grpc/examples/cpp/helloworld
mkdir -p cmake/build
cd cmake/build
cmake ../..
make -j16

ls
./greeter_server

新开终端
cd grpc/examples/cpp/helloworld/cmake/build
ls
./greeter_client


如果到这一步没有出现问题的话,就说明安装成功了。


四、protoc编译proto文件

protobuf有自己的编译器 protoc,可以将 .proto 编译成.cc文件,使之成为一个可以在 C++ 工程中直接使用的类。


1、linux环境

使用protoc命令,由proto文件生成.pb.{h,cc}和.grpc.pb.{h,cc}。
.pb.h:声明生成的消息类的头文件
.pb.cc:包含消息类的实现
.grpc.pb.h:声明生成的服务类的头文件
.grpc.pb.cc:包含服务类的实现

在grpc/examples/cpp目录下新建文件夹,例如service_error,将service_Error.proto放入该新建文件夹中,在该文件夹目录下输入命令:

protoc --proto_path=. --cpp_out=. ./service_Error.proto

protoc:解析proto文件并根据给定的选项生成输出,其命令格式是protoc [OPTION] PROTO_FILES,最后一项是待编译的proto文件的位置
–proto_path:指定要在其中搜索导入(import)的目录,可指定多次,目录将按顺序搜索,若没有指定,则使用当前工作目录。如果proto文件里面import相应文件,会去指定目录搜索相应的文件。(本次该选项可以不指定)
–cpp_out:指定.pb.cc和.pb.h文件的输出目录

查看grpc_cpp_plugin的所在路径,grpc_cpp_plugin是grpc的protoc插件。whereis命令用于查找文件。

whereis grpc_cpp_plugin

输入命令:
protoc --proto_path=./ --grpc_out=./ --plugin=protoc-gen-grpc=/usr/bin/grpc_cpp_plugin service_Error.proto
#--grpc_out:指定.grpc.pb.cc和.grpc.pb.h文件的输出目录
#--plugin:指定要使用的插件可执行文件。可执行文件的形式是名称=路径,在这种情况下给定的插件名称映射到给定的可执行文件。


2、windows环境

新建文件夹放入proto文件,例如service_Error.proto文件。在该文件夹下新建文档,修改后缀为bat。在该文件夹中新建文件夹,名称为gen-cpp,用于存放grpc输出文件。
可以通过以下方式显示后缀便于修改:

查找protoc.exe文件的路径
查找grpc_cpp_plugin.exe文件路径

选中bat文件,右键“编辑”,输入命令,例如proto.exe路径为:
E:\workspace\ui\thirdparty\bin\protoc.exe
则输入命令(注意修改为自己相应文件所在路径):
E:\workspace\ui\thirdparty\bin\protoc.exe -I=./ --cpp_out=./gen-cpp ./service_Error.proto
E:\workspace\ui\thirdparty\bin\protoc.exe -I=./ --grpc_out=./gen-cpp --plugin=protoc-gen-grpc="E:\workspace\ui\thirdparty\bin\grpc_cpp_plugin.exe" ./service_Error.proto
pause

第一条命令中-I和-cpp_out选项与linux中protoc命令的选项–proto_path和-cpp_out作用相同。
第二条命令中–grpc_out和–plugin选项与linux中–grpc_out和–plugin选项作用相同。
pause 暂停CMD窗口操作

保存后,选中bat文件,右键“以管理员身份运行”,打开gen-cpp文件夹,已生成.pb.{h,cc}和.grpc.pb.{h,cc}文件


以上就是安装GRPC和PROTOC以及编译proto文件的整个过程。







推荐阅读
  • 本文详细介绍了如何在Oracle VM VirtualBox中实现主机与虚拟机之间的数据交换,包括安装Guest Additions增强功能,以及如何利用这些功能进行文件传输、屏幕调整等操作。 ... [详细]
  • Jupyter Notebook多语言环境搭建指南
    本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
  • 实践指南:使用Express、Create React App与MongoDB搭建React开发环境
    本文详细介绍了如何利用Express、Create React App和MongoDB构建一个高效的React应用开发环境,旨在为开发者提供一套完整的解决方案,包括环境搭建、数据模拟及前后端交互。 ... [详细]
  • 深入解析Unity3D游戏开发中的音频播放技术
    在游戏开发中,音频播放是提升玩家沉浸感的关键因素之一。本文将探讨如何在Unity3D中高效地管理和播放不同类型的游戏音频,包括背景音乐和效果音效,并介绍实现这些功能的具体步骤。 ... [详细]
  • 默认情况下,Git 使用 Nano 编辑器进行提交信息的编辑,但如果您更喜欢使用 Vim,可以通过简单的配置更改来实现这一变化。本文将指导您如何通过修改全局配置文件来设置 Vim 作为默认的 Git 提交编辑器。 ... [详细]
  • 本文详细介绍了在Linux操作系统上安装和部署MySQL数据库的过程,包括必要的环境准备、安装步骤、配置优化及安全设置等内容。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中安装 Python 3.7 的步骤,包括编译工具的安装、Python 3.7 源码的下载与编译、软链接的创建以及常见错误的处理方法。 ... [详细]
  • 本文详细介绍了在Mac平台上安装和配置MySQL的步骤,包括下载安装包、卸载MySQL以及解决命令行中找不到mysql命令的问题。 ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • 深入体验Python的高级交互式Shell - IPython
    IPython 是一个增强型的 Python 交互式 Shell,提供了比标准 Python 控制台更为强大的功能,适用于开发和调试过程。它不仅支持直接执行 Linux 命令,还提供了丰富的特性来提高编程效率。 ... [详细]
  • 如何在PHP中安装Xdebug扩展
    本文介绍了如何从PECL下载并编译安装Xdebug扩展,以及如何配置PHP和PHPStorm以启用调试功能。 ... [详细]
  • PyCharm 安装与首个 Python 程序实践
    本文将指导您如何安装 PyCharm,并通过创建一个简单的 'Hello, World' 程序来初步体验这一强大的 Python 集成开发环境。 ... [详细]
  • protobuf 使用心得:解析与编码陷阱
    本文记录了一次在广告系统中使用protobuf进行数据交换时遇到的问题及其解决过程。通过这次经历,我们将探讨protobuf的特性和编码机制,帮助开发者避免类似的陷阱。 ... [详细]
  • 在现代前端开发中,组件化已成为不可或缺的技术,尤其在 React 和 Vue 生态中。然而,组件的管理和测试一直是开发者面临的挑战。本文将介绍如何使用 Storybook 来简化这一过程,提高开发效率。 ... [详细]
  • 在将 Android Studio 从 3.0 升级到 3.1 版本后,遇到项目无法正常编译的问题,具体错误信息为:org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:processDemoProductDebugResources'。 ... [详细]
author-avatar
圣换少爷
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有