• 在Ubuntu20.04环境下安装GRPC


    由于工作项目中涉及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
    安装成功后即可全屏显示与拖放文件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    命令如下:

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

    在这里插入图片描述

    二、安装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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3、克隆grpc存储库

    命令如下:

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

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

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

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

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    三、测试

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

    cd grpc/examples/cpp/helloworld
    mkdir -p cmake/build
    cd cmake/build
    cmake ../..
    make -j16
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ls
    ./greeter_server
    
    • 1
    • 2

    新开终端
    cd grpc/examples/cpp/helloworld/cmake/build
    ls
    ./greeter_client
    
    • 1
    • 2
    • 3
    • 4


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

    四、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
    
    • 1

    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
    
    • 1

    输入命令:
    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:指定要使用的插件可执行文件。可执行文件的形式是名称=路径,在这种情况下给定的插件名称映射到给定的可执行文件。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、windows环境

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

    查找protoc.exe文件的路径
    查找grpc_cpp_plugin.exe文件路径
    
    • 1
    • 2
    选中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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    第一条命令中-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文件的整个过程。

  • 相关阅读:
    程序员开发过程中还是需要写注释的
    Linux常用命令— 目录和文件都能操作的命令
    零基础Linux_12(进程)笔试选择题:冯诺依曼结构+操作系统+进程
    C++中的深拷贝和浅拷贝介绍
    常用的卷积神经网络模型,卷积神经网络改进算法
    栈的应用场景和介绍 [数据结构][Java]
    Java零拷贝(一):从硬件到内核再到源码分析
    C语言例题(递归、二分查找、冒泡排序)
    Hibernate 配置文件详解
    外汇天眼:如何交易外汇缺口?
  • 原文地址:https://blog.csdn.net/qq_43262059/article/details/127835660