当前位置: 首页 > news >正文

在window下使用visual studio + cmake gui 源码编译 gRPC

文章目录

      • 准备工作
      • cmake gui 配置
      • visual studio 操作
      • cmakelist 编写

准备工作

  1. 下载visual studio
  2. 下载cmake gui
  3. 拉取gRPC源码
  4. 下载nasm
  5. 仓库处理
    git clone git@github.com:grpc/grpc.git
    #切换到你想要的一个版本分支,如下
    git checkout -b v1.6 origin/v1.60.x
    #初始化并拉取子仓库
    git submodule update --init --recursive
    #要是一起拉不下就一个个拉
    #使用status查看状态
    git submodule status
    

cmake gui 配置

在这里插入图片描述

  • 按照上述步骤
    1. 选择源码文件夹
    2. 选择配置后的文件夹
    3. 开始配置
    4. 完成配置
    5. 开始编译
  • 说一些重要的配置参数
    在这里插入图片描述
  1. 勾选编译为动态库,不勾就是为静态库
  2. 安装后的路径

在这里插入图片描述

  1. grpc默认的配置是build各种语言,这样会导致编译出来的库非常大,这里我们只选择我们的开发语言
  2. 构建proto库

visual studio 操作

  • 上述步骤5后打开vs,右键生成
    在这里插入图片描述
  • 生成的时间有点久,生成完成后没有报错全部成功后,就可以安装了
    在这里插入图片描述
  • 这步完成后就可以到我们在cmake gui时配置的文件路径下找到对应的库了,结构如下
    在这里插入图片描述

cmakelist 编写

  • 这里我直接贴上我的demo
  • 新建一个grpc.cmake的文件,代码如下
cmake_minimum_required(VERSION 3.16)if(MSVC)add_definitions(-D_WIN32_WINNT=0x600)
endif()find_package(Threads REQUIRED)if(GRPC_AS_SUBMODULE)add_subdirectory(../../.. ${CMAKE_CURRENT_BINARY_DIR}/grpc EXCLUDE_FROM_ALL)message(STATUS "Using gRPC via add_subdirectory.")set(_PROTOBUF_LIBPROTOBUF libprotobuf)set(_REFLECTION grpc++_reflection)set(_ORCA_SERVICE grpcpp_orca_service)if(CMAKE_CROSSCOMPILING)find_program(_PROTOBUF_PROTOC protoc)else()set(_PROTOBUF_PROTOC $<TARGET_FILE:protobuf::protoc>)endif()set(_GRPC_GRPCPP grpc++)if(CMAKE_CROSSCOMPILING)find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin)else()set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:grpc_cpp_plugin>)endif()
elseif(GRPC_FETCHCONTENT)message(STATUS "Using gRPC via add_subdirectory (FetchContent).")include(FetchContent)FetchContent_Declare(grpcGIT_REPOSITORY https://github.com/grpc/grpc.gitGIT_TAG        vGRPC_TAG_VERSION_OF_YOUR_CHOICE)FetchContent_MakeAvailable(grpc)set(_PROTOBUF_LIBPROTOBUF libprotobuf)set(_REFLECTION grpc++_reflection)set(_PROTOBUF_PROTOC $<TARGET_FILE:protoc>)set(_GRPC_GRPCPP grpc++)if(CMAKE_CROSSCOMPILING)find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin)else()set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:grpc_cpp_plugin>)endif()
else()option(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)if(CMAKE_CROSSCOMPILING)find_program(_PROTOBUF_PROTOC protoc)else()set(_PROTOBUF_PROTOC $<TARGET_FILE:protobuf::protoc>)endif()find_package(gRPC CONFIG REQUIRED)message(STATUS "Using gRPC ${gRPC_VERSION}")set(_GRPC_GRPCPP gRPC::grpc++)if(CMAKE_CROSSCOMPILING)find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin)else()set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:gRPC::grpc_cpp_plugin>)endif()
endif()# ================== gRPC生成函数 ==================
function(grpc_generate_cpp SRC_FILES HDR_FILES)if(NOT ARGN)message(SEND_ERROR "Error: grpc_generate_cpp() called without any proto files")return()endif()set(${SRC_FILES})set(${HDR_FILES})foreach(proto_file ${ARGN})get_filename_component(proto_name ${proto_file} NAME_WE)get_filename_component(proto_full_path ${proto_file} ABSOLUTE)file(RELATIVE_PATH proto_relative_path ${CMAKE_CURRENT_SOURCE_DIR} ${proto_full_path})get_filename_component(relative_directory ${proto_relative_path} DIRECTORY)if(NOT relative_directory)set(proto_name_full "${proto_name}")else()set(proto_name_full "${relative_directory}/${proto_name}")endif()set(generated_pb_cc "${CMAKE_CURRENT_BINARY_DIR}/${proto_name_full}.pb.cc")set(generated_pb_h "${CMAKE_CURRENT_BINARY_DIR}/${proto_name_full}.pb.h")set(generated_grpc_pb_cc "${CMAKE_CURRENT_BINARY_DIR}/${proto_name_full}.grpc.pb.cc")set(generated_grpc_pb_h "${CMAKE_CURRENT_BINARY_DIR}/${proto_name_full}.grpc.pb.h")list(APPEND ${SRC_FILES} "${generated_pb_cc}")list(APPEND ${HDR_FILES} "${generated_pb_h}")list(APPEND ${SRC_FILES} "${generated_grpc_pb_cc}")list(APPEND ${HDR_FILES} "${generated_grpc_pb_h}")add_custom_command(OUTPUT "${generated_pb_cc}" "${generated_pb_h}" "${generated_grpc_pb_cc}" "${generated_grpc_pb_h}"COMMAND ${_PROTOBUF_PROTOC}ARGS --grpc_out=${CMAKE_CURRENT_BINARY_DIR}--cpp_out=${CMAKE_CURRENT_BINARY_DIR}--plugin=protoc-gen-grpc=${_GRPC_CPP_PLUGIN_EXECUTABLE}-I ${CMAKE_CURRENT_SOURCE_DIR}${proto_relative_path}WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}DEPENDS ${proto_file}COMMENT "Generating gRPC sources for ${proto_file}")endforeach()set_source_files_properties(${${SRC_FILES}} ${${HDR_FILES}} PROPERTIES GENERATED TRUE)set(${SRC_FILES} ${${SRC_FILES}} PARENT_SCOPE)set(${HDR_FILES} ${${HDR_FILES}} PARENT_SCOPE)
endfunction()# ================== 自动查找所有proto文件 ==================
file(GLOB_RECURSE PROTO_FILES "${CMAKE_CURRENT_SOURCE_DIR}/proto/*.proto")
if(NOT PROTO_FILES)message(WARNING "No proto files found in ${CMAKE_CURRENT_SOURCE_DIR}/proto/")
endif()# ================== 生成所有proto文件 ==================
grpc_generate_cpp(GRPC_PROTO_SRC GRPC_PROTO_HDR ${PROTO_FILES})# ================== 创建gRPC库 ==================
add_library(hmi_grpc_proto STATIC${GRPC_PROTO_SRC}
)target_include_directories(hmi_grpc_proto PUBLIC${CMAKE_CURRENT_BINARY_DIR}  # 生成的pb.h文件位置
)target_link_libraries(hmi_grpc_proto${_REFLECTION}${_GRPC_GRPCPP}${_PROTOBUF_LIBPROTOBUF}
)
  • cmakelist如下
cmake_minimum_required(VERSION 3.16)
project(gRPC_test LANGUAGES CXX)set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 设置gRPC根目录
set(GRPC_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/third_party/grpc")# 添加自定义查找路径
list(APPEND CMAKE_PREFIX_PATH "${GRPC_ROOT}")include(grpc.cmake)# 添加可执行文件
add_executable(server src/server.cpp)
add_executable(client src/client.cpp)# 包含目录
target_include_directories(server PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/proto
)target_include_directories(client PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/proto
)# 链接库
target_link_libraries(server PRIVATEhmi_grpc_proto)target_link_libraries(client PRIVATEhmi_grpc_proto
)

文章转载自:

http://JuQdm9WV.bppmL.cn
http://icZ4h8GC.bppmL.cn
http://AElHXOX0.bppmL.cn
http://4uzobNbK.bppmL.cn
http://L9SQ36AU.bppmL.cn
http://onzhkNEx.bppmL.cn
http://UKdeyRm8.bppmL.cn
http://pDwLxgo8.bppmL.cn
http://ipyX7EzW.bppmL.cn
http://zPedKzAx.bppmL.cn
http://saUDdOPk.bppmL.cn
http://ZRmNXT9t.bppmL.cn
http://V5XN2A1k.bppmL.cn
http://L05XiRfY.bppmL.cn
http://sTkyMG0Y.bppmL.cn
http://65RpjTSE.bppmL.cn
http://yiBWcQtE.bppmL.cn
http://gxhbeZIY.bppmL.cn
http://x8peNsIp.bppmL.cn
http://nkvy1wtZ.bppmL.cn
http://t6tFW08y.bppmL.cn
http://h9ktx8KA.bppmL.cn
http://cQTZB3Bx.bppmL.cn
http://jGY26Bmu.bppmL.cn
http://EkzcvmNn.bppmL.cn
http://jsBPy4ta.bppmL.cn
http://fr56lNk6.bppmL.cn
http://QBgDULnJ.bppmL.cn
http://w2UIOgMW.bppmL.cn
http://oCBBX74U.bppmL.cn
http://www.dtcms.com/a/386759.html

相关文章:

  • C# halcon 拼图例子
  • 网络:常见的高速网卡(100Gbps和400Gbps)
  • 第十四届蓝桥杯青少组C++选拔赛[2022.12.18]第二部分编程题(4、充电站)
  • 华为P10plus adb 无线调试USB拔除后立即失效解决
  • openharmony 鸿蒙 下 利用蓝牙API(a2dp模块-高级音频,ble模块-低功耗蓝牙等)完成对蓝牙音响的控制(蓝牙广播)
  • 软考-系统架构设计师 需求工程详细讲解
  • 优化 Coze Studio 依赖管理:镜像源配置与高效实践
  • AIGC入门,从理解通信协议sse与streamhttp开始
  • cuda编程笔记(20)-- 混合精度计算
  • 服务器性能测试的性能指标包括哪些?服务器性能测试工具有哪些?
  • 【面试场景题】跨库数据表关联查询怎么处理
  • 无需复杂正则:SLS 新脱敏函数让隐私保护更简单高效
  • [特殊字符]网络安全学习笔记day1——基本概念,包括域名、DNS、脚本语言、后门、WEB、WEB漏洞
  • 使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第三十讲)
  • Langchain4j开发之AI Service
  • 红帽证书需要什么报考条件
  • Ubuntu 虚拟机 | DPDK 协议栈开发 | 2、DPDK驱动绑定VMWare模拟网卡 + Testpmd发包测试
  • 【高等数学】第十二章 无穷级数——第二节 常数项级数的审敛法
  • 从弱 AI 到通用人工智能(AGI):我们还需要跨越哪些技术鸿沟?
  • Redis 在分布式会话管理中的应用:从单体到微服务的平滑迁移
  • 说说你对闭包的理解? 闭包使⽤场景
  • MySQL 存储过程完整实战手册---一篇吃透 Stored Procedure
  • Leetcode 763. 划分字母区间 贪心
  • 嵌入式系统arm高级系统调试技能-25.cat proc/vmallocinfo文件内容解读,内存异常分析
  • 良策金宝AI的技术内核:工程大模型如何破解行业知识壁垒
  • WJCZ(唯诺因)黄金三角抗衰体系的科学机制与作用解析
  • Base64:原理、应用与底层实现详解
  • 【设计模式】解析命令模式并附带一个可撤销重做的例子
  • Python爬虫实战:研究Pandas,构建物联网数据采集和分析系统
  • 视频无法播放怎么办?附详细故障排查指南