【gRPC】C++下使用CMakeLists快速构建项目
在gRPC中,编写.proto文件(protocol buffer文件)来定义RPC服务的接口是第一步
先通过proto的代码生成器编译生成pb.h、pb.cc、grpc.pb.h、grpc.pb.cc。然后在编写client和server时引入头文件进行使用。以下的代码能帮助我们快速的生成以上的四个文件并编译client和server到可执行文件,根据需求修改内容即可
#标记最低CMake版本
cmake_minimum_required(VERSION 3.5.1)
#项目名称及使用语言情况
project(HelloWorld C CXX)
#指定本地的CMake程序位置,如果电脑上在不同位置都安装了CMake,可以依次往后附加,此处添加的为官网教程安装位置
list(APPEND CMAKE_PREFIX_PATH "/home/$ENV{USER}/.local/bin")
#查找本地Protobuf模块的库信息,实际上CMake就是在找Protobuf-config.cmake文件
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)
if(CMAKE_CROSSCOMPILING)
find_program(_PROTOBUF_PROTOC protoc)
else()
set(_PROTOBUF_PROTOC $<TARGET_FILE:protobuf::protoc>)
endif()
# Find gRPC installation
# Looks for gRPCConfig.cmake file installed by gRPC's cmake installation.
#查找本地gRPC模块的库信息
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()
# Proto file
get_filename_component(data_proto "../data.proto" ABSOLUTE)
get_filename_component(data_proto_path "${data_proto}" PATH)
# Generated sources
#代码生成器的目标文件位置
set(data_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/data.pb.cc")
set(data_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/data.pb.h")
set(data_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/data.grpc.pb.cc")
set(data_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/data.grpc.pb.h")
#代码生成器脚本,根据proto文件生成C++的四个文件
add_custom_command(
OUTPUT "${data_proto_srcs}" "${data_proto_hdrs}" "${data_grpc_srcs}" "${data_grpc_hdrs}"
COMMAND ${_PROTOBUF_PROTOC}
ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}"
--cpp_out "${CMAKE_CURRENT_BINARY_DIR}"
-I "${data_proto_path}"
--plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}"
"${data_proto}"
DEPENDS "${data_proto}")
#到这里为止,代码生成器部分结束,以下为对项目的编译链接
# Include generated *.pb.h files
#项目include目录,可以在后面不断添加项目使用的头文件的目录位置
include_directories("${CMAKE_CURRENT_BINARY_DIR}")
#将grpc的四个文件编译成一个库
# data_grpc_proto
add_library(data_grpc_proto
${data_grpc_srcs}
${data_grpc_hdrs}
${data_proto_srcs}
${data_proto_hdrs})
#链接库data_grpc_proto,会生成链接文件
target_link_libraries(data_grpc_proto
${_REFLECTION}
${_GRPC_GRPCPP}
${_PROTOBUF_LIBPROTOBUF})
#编译链接server和client,这里需要自己提前写好,否则会报错哟
# Targets [async_](client|server)
foreach(_target
client server)
add_executable(${_target} "${_target}.cpp")
target_link_libraries(${_target}
data_grpc_proto
${_REFLECTION}
${_GRPC_GRPCPP}
${_PROTOBUF_LIBPROTOBUF})
endforeach()
【gRPC】C++下使用CMakeLists快速构建项目的更多相关文章
- 用vue-cli快速构建项目
用vue-cli脚手架快速构建项目的过程:1.首先要在node的环境下安装: 1>安装node:https://nodejs.org/en/(带npm,但是npm太慢了,建议安装cnpm,cnp ...
- SpringBoot:使用IDEA快速构建项目
西部开源-秦疆老师:基于SpringBoot 2.1.6 的博客教程 秦老师交流Q群号: 664386224 未授权禁止转载!编辑不易 , 转发请注明出处!防君子不防小人,共勉! SpringBoot ...
- SpringBoot系列——快速构建项目
前言 springboot官方参考指南:https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/ Spri ...
- vue2.x利用脚手架快速构建项目并引入bootstrap、jquery
要使用vue-cli脚手架搭建项目,首先需要安装node.js Node.js官网:https://nodejs.org/en/download/ 选择你对应的系统即可下载,下载完成后傻瓜式安装即可. ...
- springboot+maven快速构建项目
最近公司运用springboot构建项目,确实比ssh搭建要快很多.springboot官方学习网站 1.首先要下载maven,用maven管理项目很方便,下载完maven配置好环境,maven我就不 ...
- JAVAEE——SpringBoot入门:简介、微服务、环境准备、helloworld与探究、快速构建项目
一.Spring Boot 入门 1.Spring Boot 简介 简化Spring应用开发的一个框架: 整个Spring技术栈的一个大整合: J2EE开发的一站式解决方案: 2.微服务 2014,m ...
- 转载: 我如何使用 Django + Vue.js 快速构建项目
原文链接: https://www.ctolib.com/topics-109796.html 正文引用如下 引言 大U的技术课堂 的新年第一课,祝大家新的一年好好学习,天天向上:) 本篇将手把手教你 ...
- vue 概念与使用vue-cli脚手架快速构建项目
vue 定义:是一套构建用户界面的渐进式框架,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,它不仅易于上手,还便于与第三方库或既有项目整合. 数据渲染机制: 核心: 响应式数据绑定 ...
- 使用ember-cli脚手架快速构建项目
步骤: 安装Ember. 创建一个新应用程序. 定义路由. 编写一个UI组件. 构建您的应用程序以部署到生产环境. 安装Ember 您可以使用npm(Node.js包管理器,你需要安装node.js) ...
随机推荐
- java运算符(超详细!!!)
java运算符 一.算数运算符 符号 含义 + 加法 - 减法 * 乘法 / 除法 % 余数 ++ 自增 -- 自减 这些是常用的算数运算符,在java基础阶段,掌握这些就可 加减乘除运算符 代码实例 ...
- 输入一个url全过程详解
1. 用户在浏览器中输入url,浏览器接收到url. 2.浏览器接收到这个url之后,会根据这个url会先查看缓存,如果有缓存且没有过期的话直接提供给客户端,完成页面渲染. 3.否则浏览器就会通过DN ...
- NewApiDay03_File类
File类创建一个新文件 File类的每一个实例可以表示硬盘(文件系统)中的一个文件或目录(实际上表示的是一个抽象路径) 使用File可以做到: 1:访问其表示的文件或目录的属性信息,例如:名字,大小 ...
- 1.JS中变量的重新声明和提升
重新声明 1.允许在程序的任何位置使用 var 重新声明 JavaScript 变量: 实例 var x = 10; // 现在,x 为 10 var x = 6; // 现在,x 为 6 2.在相同 ...
- NodeJS 基于 Dapr 构建云原生微服务应用,从 0 到 1 快速上手指南
Dapr 是一个可移植的.事件驱动的运行时,它使任何开发人员能够轻松构建出弹性的.无状态和有状态的应用程序,并可运行在云平台或边缘计算中,它同时也支持多种编程语言和开发框架.Dapr 确保开发人员专注 ...
- 搞懂前端二进制系列(二):🍈File、FileReader与Base64
参考资料: JavaScript高级程序设计第四版:File API https://juejin.cn/post/7046313942938812424[前端二进制一次搞清楚] 一.File 类型 ...
- js实现全屏弹框
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- typora的第一天
一级标题 二级标题 三级标题 ..... 表格 java spring mybatis 代码 java代码 public void Hello(){ } 字体 hello word! hello wo ...
- React报错之Style prop value must be an object
正文从这开始~ 总览 在React中,当我们为元素的style 属性传递字符串时,会产生"Style prop value must be an object"警告.为了解决该警告 ...
- 解决 idea无法下载源码 Sources not found for:XXX
解决 idea无法下载源码 Sources not found for:XXX 命令行输入 mvn dependency:resolve -Dclassifier=sources 参考 https:/ ...