c++下grpc开发的环境配置

记录这段配置过程的原因

最近在做go语言下的grpc开发,但是既然grpc框架本身就是跨语言的,所以自己索性就想能不能把自己的项目改成跨语言的微服务项目呢?出于这个原因,就想着将项目中的组件都做一个c/c++语言的版本。由于此前go的开发使用的都是GoLand,所以这次回到c/c++也选择了CLion作为开发的IDE。但是在环境的配置过程中发现c++下的grpc配置比go语言难很多(也可能是因为我经验不足),在网上搜索也没有找到具体的教程,所以自己去摸索了一下CLion配置grpc的过程。

具体配置过程

grpc的安装

首先最重要的就是grpc的源码下载,如果可以直接从github上克隆是最好的,直接在命令行clone即可。

git clone https://github.com/grpc/grpc.git

如果无法访问也可以选择国内的镜像源

git clone https://gitee.com/mirrors/grpc-framework.git

下载完成之后的grpc并不完整,因为还缺失了依赖的第三方库。

在grpc的文件夹下有一个叫做 .gitmodules 的文件,这个文件就指定了第三方库的下载地址,也就是对应的url。

[submodule "third_party/abseil-cpp"]
        path = third_party/abseil-cpp
        url = https://github.com/abseil/abseil-cpp.git
[submodule "third_party/benchmark"]
        path = third_party/benchmark
        url = https://github.com/google/benchmark
[submodule "third_party/bloaty"]
        path = third_party/bloaty
        url = https://github.com/google/bloaty.git
[submodule "third_party/boringssl-with-bazel"]
        path = third_party/boringssl-with-bazel
        url = https://github.com/google/boringssl.git
[submodule "third_party/cares/cares"]
        path = third_party/cares/cares
        url = https://github.com/c-ares/c-ares.git
[submodule "third_party/envoy-api"]
        path = third_party/envoy-api
        url = https://github.com/envoyproxy/data-plane-api.git
[submodule "third_party/googleapis"]
        path = third_party/googleapis
        url = https://github.com/googleapis/googleapis.git
[submodule "third_party/googletest"]
        path = third_party/googletest
url = https://github.com/google/googletest.git
[submodule "third_party/libuv"]
        path = third_party/libuv
        url = https://github.com/libuv/libuv.git
[submodule "third_party/opencensus-proto"]
        path = third_party/opencensus-proto
        url = https://github.com/census-instrumentation/opencensus-proto.git
[submodule "third_party/opentelemetry"]
        path = third_party/opentelemetry
        url = https://github.com/open-telemetry/opentelemetry-proto.git
[submodule "third_party/protobuf"]
        path = third_party/protobuf
        url = https://github.com/protocolbuffers/protobuf.git
[submodule "third_party/protoc-gen-validate"]
        path = third_party/protoc-gen-validate
        url = https://github.com/envoyproxy/protoc-gen-validate.git
[submodule "third_party/re2"]
        path = third_party/re2
        url = https://github.com/google/re2.git
[submodule "third_party/xds"]
        path = third_party/xds
        url = https://github.com/cncf/xds.git
[submodule "third_party/zlib"]
        path = third_party/zlib
        url = https://github.com/madler/zlib
        # 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

这是我当时下载grpc镜像中这个文件的内容,随着grpc的更新这其中的内容可能会发生改变,但是本质都是一样的。

如果我们直接让grpc去这些地址下载第三方库那肯定会很慢,所以我们需要逐个换源。

[submodule "third_party/abseil-cpp"]
        path = third_party/abseil-cpp
        url = https://gitee.com/run_zchenglong/abseil-cpp.git
[submodule "third_party/benchmark"]
        path = third_party/benchmark
        url = https://gitee.com/liangwenhao/benchmark.git
[submodule "third_party/bloaty"]
        path = third_party/bloaty
        url = https://gitee.com/jhm88/bloaty.git
[submodule "third_party/boringssl-with-bazel"]
        path = third_party/boringssl-with-bazel
        url = https://gitee.com/jhm88/boringssl.git
[submodule "third_party/cares/cares"]
        path = third_party/cares/cares
        url = https://gitee.com/jhm88/c-ares.git
[submodule "third_party/envoy-api"]
        path = third_party/envoy-api
        url = https://gitee.com/jhm88/data-plane-api.git
[submodule "third_party/googleapis"]
        path = third_party/googleapis
        url = https://gitee.com/run_zchenglong/googleapis.git
[submodule "third_party/googletest"]
        path = third_party/googletest
		url = https://gitee.com/liangwenhao/googletest.git
[submodule "third_party/libuv"]
        path = third_party/libuv
        url = https://gitee.com/jhm88/libuv.git
[submodule "third_party/opencensus-proto"]
        path = third_party/opencensus-proto
        url = https://gitee.com/jhm88/opencensus-proto.git
[submodule "third_party/opentelemetry"]
        path = third_party/opentelemetry
        url = https://gitee.com/goccoder/opentelemetry-proto.git
[submodule "third_party/protobuf"]
        path = third_party/protobuf
        url = https://gitee.com/paddle-mirror/protobuf.git
[submodule "third_party/protoc-gen-validate"]
        path = third_party/protoc-gen-validate
        url = https://gitee.com/jhm88/protoc-gen-validate.git
[submodule "third_party/re2"]
        path = third_party/re2
        url = https://gitee.com/jhm88/re2.git
[submodule "third_party/xds"]
        path = third_party/xds
        url = https://gitee.com/jhm88/xds.git
[submodule "third_party/zlib"]
        path = third_party/zlib
        url = https://gitee.com/jhm88/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

随着grpc的更新,可能这个文件的内容会发生改变。但是只需要将新出现的依赖文件同样换源就可以了,我是在gitee.com搜索的对应源,然后复制的url。

更改文件内容之后,进入我们克隆下来的grpc文件夹。由于源不同,所以克隆下来的文件夹名字可能不一样。如果使用的是上面的国内镜像源,文件夹就会叫grpc-framework。你也可以改成grpc这个官方的文件夹名。

然后进入这个文件夹,在这个文件夹中运行这个命令来下载第三方库。

git submodule update --init

下载完成后创建CMake对应的文件夹,并进入这个文件夹。

mkdir -p cmake/build
cd cmake/build

执行这两个命令来编译可以用于安装的文件

cmake ../..
make

(如果在make的过程中提醒你缺少了某个库,就自己手动前往grpc/third_party这个目录下把缺少的库同名文件夹删掉,再手动使用git克隆) 很重要!!!

rm -rf "对应的库同名文件夹"
git clone "对应的库的url"(例如 https://gitee.com/jhm88/xds.git)

执行完make之后就可以安装了,在cmake/build目录下

sudo make install

protobuf的安装

进入grpc文件夹内的protobuf文件夹

cd third_party/protobuf

同理我们先更改.gitmodules文件

[submodule "third_party/benchmark"]
        path = third_party/benchmark
        url = https://gitee.com/liangwenhao/benchmark.git
        ignore = dirty
[submodule "third_party/googletest"]
        path = third_party/googletest
        url = https://gitee.com/liangwenhao/googletest.git
        ignore = dirty

然后执行这个命令下载依赖库

git submodule update --init

下载完成后执行和上面相同的流程

mkdir build
cd build
cmake ..
make
sudo make install

到这里protobuf就安装完成了,可以使用这个命令查看当前protobuf的版本

protoc --version

C++中.proto文件生成对应的.h和.cc文件

因为grpc对应的.h.cc文件依赖protobuf对应的.h.cc文件,所以最好按这个顺序生成。

生成protobuf对应的.h.cc文件

protoc --cpp_out=. *.proto (*改成对应的文件名)

生成grpc对应的.h.cc文件

protoc --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` *.proto (*改成对应的文件名)

这样就可以使用grpc啦

CLion环境配置

因为最开始学习c++的时候学校都要求使用vs,后来自己去接触c++的web服务器开发的时候出于方便远程连接的目的一直使用的是vscode。所以这次使用CLion,查看.proto文件生成的protobufgrpc对应的.h文件和.cc文件的时候,一直显示没有protobufgrpc的头文件让我郁闷了很久(但其实用命令行生成可执行文件应该是没有问题的)。

后来在上课配置OpenGL环境的过程中,我根据网上的教程发现更改了CLion项目对应的CMakeLists.txt文件并重新构建以后就能够找到openGL对应的头文件了!

于是我猜想可能grpc也是因为这个原因,所以我去学习了CMake的语法(因为还在上学所以没有接触过CMake,之前最多就是在做WebServer的时候用makefile)。我发现关键就在于要在项目对应的CMakeLists.txt文件中引入protobufgrpc对应的第三方库。也就是在项目对应的CMakeLists.txt文件加入这个命令:

include_directories(
        "grpc库对应的路径"
        "protobuf对应库的路径"
)

由于在安装过程中,protobufgrpc大概率不会自己设置环境变量。而且设置环境变量可能对于初学者来说有些麻烦,所以我们这里直接使用绝对路径。

protobuf的路径在:

"/usr/local/include"

grpc的路径在:

"grpc文件夹的绝对路径/include"

grpc的文件夹内使用pwd命令就可以查看当前文件夹的绝对路径啦。

这样我们所有的配置就都做完了,就可以在CLion中正常使用grpc了。

结语

由于这是我第一次写博客,所以如果有什么错误麻烦各位斧正,谢谢!

有问题也可以在评论区问我哦

参考链接
https://blog.csdn.net/qq_44519484/article/details/117263951
https://cloud.tencent.com/developer/article/2071165

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值