arm机器上使用Qt和grpc构建程序

本文介绍如何在ARM架构的Linux系统上使用Qt和gRPC进行程序开发,包括生成必要的文件、配置CMakeLists.txt文件及交叉编译设置。

准备的前提

一定要交叉编译好Qt的源码和grpc的源码。如果不会可以看我的另外的一篇文章,都有讲grpc的交叉编译的过程。由于我们arm上使用的是Linux的系统,我们就使用Cmake来构建我们的项目。

生成需要的文件

protoc -I. --grpc_out=. --plugin=protoc-gen-grpc=/bin/grpc_cpp_plugin logic.proto
protoc -I=. --cpp_out=. logic.proto

--plugin=protoc-gen-grpc=使用绝对路径
生成 *.pb.h, *.pb.cc, *.grpc.pb.h, *.grpc.pb.cc *为文件的名字

配置Cmake

#cmake的版本要求
cmake_minimum_required(VERSION 3.5)
#项目的名称和编译的语言
project(test_cmake LANGUAGES CXX)
#自动包含当前的目录
set(CMAKE_INCLUDE_CURRENT_DIR ON)
#自动查找uic和moc和rcc的程序
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
#设置链接的头文件
#target_include_directories(./include)
#include_directories(./include)
#include_directories($$PWD/include)
#include_directories(../include)
#查找Qt的程模块
find_package(Qt5 COMPONENTS Core Network)

#假设已经安装好grpc了
find_package(Threads REQUIRED)

#查找proto的库
set(protobuf_MODULE_COMPATIBLE TRUE)
find_package(Protobuf CONFIG REQUIRED)
message(STATUS "Using protobuf ${Protobuf_VERSION}")

set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf)
set(_REFLECTION gRPC::grpc++_reflection)


# Find gRPC installation
# Looks for gRPCConfig.cmake file installed by gRPC's cmake installation.
find_package(gRPC CONFIG REQUIRED)
message(STATUS "Using gRPC ${gRPC_VERSION}")
set(_GRPC_GRPCPP gRPC::grpc++)

add_executable(test_cmake
  #include/
  main.cpp
  mainwin.h
  mainwin.cpp
  message.h
  message.cpp
  model.h
  model.cpp
  logic.pb.h
  logic.pb.cc
  logic.grpc.pb.h
  logic.grpc.pb.cc
)
target_link_libraries(test_cmake
  Qt5::Core
  Qt5::Network
  ${_REFLECTION}
  ${_GRPC_GRPCPP}
  ${_PROTOBUF_LIBPROTOBUF})

配置交叉编译文件

cat > /tmp/toolchain.cmake <<'EOT'
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_STAGING_PREFIX /tmp/stage)
set(CMAKE_C_COMPILER /home/dou/tool/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /home/dou/tool/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
EOT

配置编译器的类型--·最好是配置绝对路径

执行cmake

cmake -DCMAKE_TOOLCHAIN_FILE=/tmp/toolchain.cmake \
      -DCMAKE_BUILD_TYPE=Release \
	  -DCMAKE_PREFIX_PATH=/home/dou/qt/qt-everywhere-src-5.14.0/build3/opt/Qt5.14.0/lib/cmake\
      -DCMAKE_INSTALL_PREFIX=./install \
      -Dabsl_DIR=/tmp/stage1/lib/cmake/absl \
      -DProtobuf_DIR=/tmp/stage1/lib/cmake/protobuf \
      -DgRPC_DIR=/tmp/stage1/lib/cmake/grpc \
      ../

-DCMAKE_TOOLCHAIN_FILE:指定交叉编译的工具链
-DCMAKE_BUILD_TYPE:是debug还是release
-DCMAKE_PREFIX_PATH:指定为Qt编译后的路径
-DCMAKE_INSTALL_PREFIX:安装的路径
-Dabsl_DIR,-DProtobuf_DIR,-DgRPC_DIR:为grpc的安装之后的对应的路径
最后一个参数为CMakeLists.txt的路径

最后执行make

make

如果当中有错误,一定要注意自己的软件的版本和grpc还有qt的版本是否是一致的,还有就就是编译的过程是否是选了release

make install
Qt中集成gRPC进行网络通信的开发是一个结合了现代远程过程调用(RPC)框架与成熟的GUI开发平台的高效方式。gRPC 是 Google 开发的一种高性能、开源的远程过程调用框架,支持多种语言,适用于构建分布式系统。Qt 提供了强大的跨平台 GUI 开发能力,同时也支持 C++11 及更高版本,这使得在 Qt 项目中集成 gRPC 成为可能。 ### 集成 gRPCQt 项目中的步骤 #### 1. 环境准备 确保你的开发环境已安装以下组件: - **Qt 开发环境**:建议使用 Qt 5.15 或 Qt 6.x,并安装好对应的 Qt Creator。 - **CMake**:gRPC 构建依赖于 CMake,建议使用 3.14 或更高版本。 - **Protocol Buffers 编译器(protoc)**:gRPC 使用 Protocol Buffers 作为其接口定义语言(IDL)。 - **gRPC 源码或预编译库**:可以从 [gRPC GitHub 仓库](https://github.com/grpc/grpc) 获取源码。 #### 2. 构建 gRPC 由于 Qt 项目通常使用 qmake 或 CMake 进行构建,推荐使用 CMake 构建 gRPC。以下是基本步骤: ```bash # 克隆 gRPC 及其子模块 git clone --recurse-submodules -b v1.44.0 https://github.com/grpc/grpc.git cd grpc # 创建构建目录 mkdir -p cmake/build cd cmake/build # 配置并构建 gRPC cmake ../../ -DCMAKE_INSTALL_PREFIX=/usr/local cmake --build . --target install ``` 上述命令将 gRPC 安装到 `/usr/local`,你可以根据需要更改安装路径。 #### 3. 配置 Qt 项目 在 `.pro` 文件中添加 gRPC Protobuf 的路径: ```qmake QT += core gui widgets network # gRPC Protobuf 的头文件路径 INCLUDEPATH += /usr/local/include # 链接 gRPC Protobuf 库 LIBS += -L/usr/local/lib \ -lgrpc++ \ -lgrpc \ -lprotobuf \ -lpthread \ -lz ``` #### 4. 定义服务接口 使用 `.proto` 文件定义你的服务接口数据结构。例如: ```proto // helloworld.proto syntax = "proto3"; package helloworld; // The greeting service definition. service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply); } // The request message containing the user's name. message HelloRequest { string name = 1; } // The response message containing the greetings message HelloReply { string message = 1; } ``` 使用 `protoc` 生成 C++ 代码: ```bash protoc --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` helloworld.proto protoc --cpp_out=. helloworld.proto ``` 这将生成 `helloworld.pb.cc` `helloworld.grpc.pb.cc` 文件。 #### 5. 实现客户端服务端 在 Qt 项目中实现 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) { GreeterClient client(grpc::CreateChannel( "localhost:50051", grpc::InsecureChannelCredentials())); std::string reply = client.SayHello("Qt User"); std::cout << "Reply: " << reply << std::endl; return 0; } ``` #### 6. 运行调试 确保服务端在运行状态,客户端可以通过 Qt 应用程序发起请求并处理响应。Qt 的信号与槽机制可以用于异步处理网络请求,提升用户体验。 ### 注意事项 - **线程管理**:gRPC 调用通常是阻塞的,建议在 Qt使用 `QThread` 或 `QtConcurrent` 来处理异步操作。 - **错误处理**:确保对 gRPC 调用的错误进行适当处理,包括网络中断、服务不可用等情况。 - **性能优化**:对于高并发场景,考虑使用 gRPC 的异步接口或流式通信[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值