热门标签 | 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文件的整个过程。







推荐阅读
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • Linuxchmod目录权限命令图文详解在Linux文件系统模型中,每个文件都有一组9个权限位用来控制谁能够读写和执行该文件的内容。对于目录来说,执行位的作用是控制能否进入或者通过 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Windows 7 部署工具DISM学习(二)添加补丁的步骤详解
    本文详细介绍了在Windows 7系统中使用部署工具DISM添加补丁的步骤。首先需要将光驱中的安装文件复制到指定文件夹,并进行挂载。然后将需要的MSU补丁解压并集成到系统中。文章给出了具体的命令和操作步骤,帮助读者完成补丁的添加过程。 ... [详细]
  • 本文介绍了在Linux中执行.sh脚本时出现/bin/sh^M: bad interpreter: No such file or directory异常的原因分析,并提供了两种解决方法:在Windows下进行编码格式转换,或在Linux中修改文件格式和执行权限。具体操作步骤也在摘要中给出。 ... [详细]
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社区 版权所有