记录这段配置过程的原因
最近在做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
文件生成的protobuf和grpc对应的.h
文件和.cc
文件的时候,一直显示没有protobuf和grpc的头文件让我郁闷了很久(但其实用命令行生成可执行文件应该是没有问题的)。
后来在上课配置OpenGL环境的过程中,我根据网上的教程发现更改了CLion项目对应的CMakeLists.txt
文件并重新构建以后就能够找到openGL对应的头文件了!
于是我猜想可能grpc也是因为这个原因,所以我去学习了CMake的语法(因为还在上学所以没有接触过CMake,之前最多就是在做WebServer的时候用makefile)。我发现关键就在于要在项目对应的CMakeLists.txt
文件中引入protobuf和grpc对应的第三方库。也就是在项目对应的CMakeLists.txt
文件加入这个命令:
include_directories(
"grpc库对应的路径"
"protobuf对应库的路径"
)
由于在安装过程中,protobuf和grpc大概率不会自己设置环境变量。而且设置环境变量可能对于初学者来说有些麻烦,所以我们这里直接使用绝对路径。
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