【C++】grpc(一):安装

因为接触了一些第三方项目和其他原因,我需要了解一些 RPC 相关的知识,首选的就是 Google 的 gRPC 库了。

安装

依然是使用WSL,发行版为Ubuntu 22.04.5 LTS

gRPC的官网如下:https://grpc.org.cn/docs/languages/cpp/quickstart/

他们的官网只建议通过下载项目编译的方式进行安装,我不是很喜欢这种方式,但是也只能按照教程来了。

构建并本地安装 gRPC 和 Protocol Buffers

设置

选择一个目录来存放本地安装的软件包。

export MY_INSTALL_DIR=$HOME/.local

确保目录存在

mkdir -p $MY_INSTALL_DIR

将本地 bin 文件夹添加到 path 变量中

export PATH="$MY_INSTALL_DIR/bin:$PATH"

安装 cmake

我的发行版使用如下

在编译或链接阶段遇到 `undefined reference to grpc::CreateChannel` 错误,通常表明链接器无法找到 gRPC 库中 `grpc::CreateChannel` 函数的定义。这可能由多个因素导致,包括但不限于 gRPC 库未正确安装、未正确链接、或使用了不兼容的 gRPC 版本。 ### 1. 确保 gRPC 库已正确安装 gRPC个依赖于 Protocol Buffers 和其他组件的框架,因此在编译项目之前,必须确保 gRPC 及其依赖项已正确安装。可以通过以下方式验证: - **Linux/macOS**:使用 `pkg-config` 检查 gRPC 是否已安装: ```bash pkg-config --libs grpc++ ``` 如果返回类似 `-lgrpc++ -lgrpc -lprotobuf` 的信息,则说明 gRPC 已正确安装。 - **Windows**:确保 gRPC 的 `.lib` 文件已添加到项目的链接器输入中,并且头文件路径已配置。 ### 2. 链接 gRPC 库 在编译时,必须确保链接器能够找到并链接 gRPC 的库文件。对于 C++ 项目,通常需要链接以下库: - `grpc++` - `grpc` - `protobuf` - `ssl` - `crypto` - `z` 例如,在 Linux 或 macOS 上,可以使用如下命令进行编译和链接: ```bash g++ -std=c++11 client.cc -o client \ -I/usr/local/include \ -L/usr/local/lib \ -lgrpc++ -lgrpc -lprotobuf -lssl -lcrypto -lz ``` 确保 `-lgrpc++` 和 `-lgrpc` 出现在链接器参数中,并且顺序正确,通常依赖库应按依赖顺序排列。 ### 3. 检查 gRPC 版本兼容性 不同版本的 gRPC 可能存在 API 差异。例如,`grpc::CreateChannel` 的使用方式在某些版本中可能已更改。如果使用的是较旧版本的 gRPC,可能需要升级到最新版本以确保兼容性。 可以通过以下方式更新 gRPC: ```bash git clone https://github.com/grpc/grpc cd grpc git submodule update --init mkdir -p cmake/build cd cmake/build cmake ../.. make sudo make install ``` 安装完成后,重新编译你的项目以确认问题是否解决。 ### 4. 检查命名空间和函数签名 在 gRPC C++ API 中,`CreateChannel` 是 `grpc` 命名空间下的个函数。确保在代码中正确使用命名空间: ```cpp std::shared_ptr<grpc::Channel> channel = grpc::CreateChannel("localhost:50051", grpc::InsecureChannelCredentials()); ``` 如果使用了错误的命名空间或过时的函数签名,可能会导致链接错误或运行时错误。 ### 5. 示例代码:gRPC 客户端初始化 以下是个简单的 gRPC 客户端初始化示例: ```cpp #include <grpcpp/grpcpp.h> #include "helloworld.grpc.pb.h" using grpc::Channel; using grpc::ClientContext; using grpc::Status; using helloworld::HelloRequest; using helloworld::HelloReply; using helloworld::Greeter; class GreeterClient { public: GreeterClient(std::shared_ptr<Channel> channel) : stub_(Greeter::NewStub(channel)) {} std::string SayHello(const std::string& user) { HelloRequest request; request.set_name(user); HelloReply reply; ClientContext context; Status status = stub_->SayHello(&context, request, &reply); if (status.ok()) { return reply.message(); } else { return "RPC failed"; } } private: std::unique_ptr<Greeter::Stub> stub_; }; int main(int argc, char** argv) { std::string target_str = "localhost:50051"; GreeterClient client(grpc::CreateChannel(target_str, grpc::InsecureChannelCredentials())); std::string user = "world"; std::string reply = client.SayHello(user); return 0; } ``` ### 6. 检查构建系统配置 如果你使用的是 `CMake`,确保 `CMakeLists.txt` 文件中包含正确的库路径和链接设置: ```cmake find_package(gRPC REQUIRED CONFIG) include_directories(${gRPC_INCLUDE_DIRS}) target_link_libraries(your_target_name ${gRPC_LIBRARIES}) ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值