【Protoc】VS2019 (VS平台) 使用 CMake 编译安装、使用 Protobuf 库

本文介绍在 macOS 系统下 cmake 和 protobuf 一起使用的一种方式——使用 cmake 自动编译 proto 文件为 pb.cc 和 pb.h 文件。

protobuf

protobuf 是谷歌发布的一种数据封装协议, 用于数据传输。在使用时需要定义好 proto 文件, 然后用 protoc 工具编译为 pb.h 和 pb.cc 文件。打开命令行输入如下命令

protoc -I=${proto_file_dir} --cpp_out=${pb_file_dir} *.proto

这里面有三个参数, -I 表示 proto 文件的路径; --cpp_out 表示输出路径; 最后一个参数表示需要被编译为 pb.h 和 pb.cc 文件的 proto 文件, *.proto 表示 -I 路径下的所有 proto 文件。


好了, 正文开始。

背景介绍

文件结构

.
├── CMakeLists.txt
├── originFile
│ └── proto1
│ ├── proto1.proto
│ ├── proto2.proto
│ └── proto3.proto
│ └── proto2
│ ├── proto4.proto
│ ├── proto5.proto
│ └── proto6.proto

目标

我们要把 originFile 中的文件编译为 pb 文件。

根据上面的指令, 我们可以很方便很快捷的生成 pb 文件,似乎没有什么不妥。但是在不同的主机上使用不同版本的 protobuf 时, 都需要重新使用指令来生成 pb 文件(因为某一版本的 protobuf 生成的 pb 文件, 不能被其他版本的 protobuf 使用)。为了简化这一过程, 我们把生成 pb 文件的事,交给 cmake 来做, 在 cmake 过程中自动去根据 proto 文件生成 pb 文件。

方法

不指定输出路径

直接上 CmakeLists.txt 文件的内容

# 项目基本配置
cmake_minimum_required(VERSION 3.5)
project(common_pb) # 获取protobuf库
find_package(Protobuf REQUIRED) #设置输出路径
SET(PROTO_DIR ${CMAKE_SOURCE_DIR}/proto/originFile) #获取需要编译的proto文件
file(GLOB_RECURSE MSG_PROTOS_1 ${PROTO_DIR}/proto1/*.proto)
file(GLOB_RECURSE MSG_PROTOS_2 ${PROTO_DIR}/proto2/*.proto) # 将 proto 编译为 pb
PROTOBUF_GENERATE_CPP(SOURCES_1 HEADERS_1 ${MSG_PROTOS_1})
PROTOBUF_GENERATE_CPP(SOURCES_2 HEADERS_2 ${MSG_PROTOS_2})

这种方式生成的 pb 文件输出在 build 文件夹里面,且不论 proto 文件结构如何, 生成的 pb 文件都会被放在同一个目录下。

这里有另一种方式,来指定输出文件的路径。

指定输出路径

cmake_minimum_required(VERSION 3.5)
project(common_pb) find_package(Protobuf REQUIRED) #设置输出路径
SET(PROTO_DIR ${CMAKE_SOURCE_DIR}/originFile/)
SET(PB_DIR ${CMAKE_SOURCE_DIR}/pbCCFile)
message("[PROTO_DIR]" ${PROTO_DIR}) #设置protoc的搜索路径
LIST(APPEND PROTO_FLAGS -I${PROTO_DIR})
#获取需要编译的proto文件
file(GLOB_RECURSE MSG_PROTOS ${PROTO_DIR}/*.proto) foreach(msg ${MSG_PROTOS})
get_filename_component(FIL_NAME ${msg} NAME_WE)
get_filename_component(FILE_PATH_ABS ${msg} ABSOLUTE)
string(REPLACE "${PROTO_DIR}" "" FILE_PATH_REL ${FILE_PATH_ABS})
string(REPLACE ".proto" ".pb.cc" FILE_NAME_CC ${FILE_PATH_REL})
string(REPLACE ".proto" ".pb.h" FILE_NAME_H ${FILE_PATH_REL})
message("[pb file relative path] " ${FILE_NAME_CC})
# 使用自定义命令
add_custom_command(
OUTPUT
"${PB_DIR}/${FILE_NAME_CC}"
"${PB_DIR}/${FILE_NAME_H}"
COMMAND ${PROTOBUF_PROTOC_EXECUTABLE}
ARGS
--cpp_out ${PB_DIR}
-I ${PROTO_DIR}
${msg}
DEPENDS ${msg}
COMMENT "Running C++ protocol buffer compiler on ${msg}"
VERBATIM
) set(PROTO_SRC ${PROTO_SRC} ${PB_DIR}/${FILE_NAME_CC})
set(PROTO_INC ${PROTO_INC} ${PB_DIR}/${FILE_NAME_H})
endforeach() # 设置文件属性为 GENERATED
set_source_files_properties(${PROTO_SRC} ${PROTO_INC} PROPERTIES GENERATED TRUE)

通过这种方式生成的 pb 可以指定输出路径。 这种方式需要自行管理文件依赖和导入路径。

CMake + Protobuf 自动生成 cpp 文件(pb.h, pb.cc)的更多相关文章

  1. vs2017自动生成的#include“stdafx.h”详解及解决方案

    vs2017自动生成的#include“stdafx.h”详解及解决方案 问题描述: 在高版本的Visual Studio的默认设置中,会出现这么一个现象,在新建项目之后,项目会自动生成#includ ...

  2. linux下使用automake工具自动生成makefile文件

    linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Au ...

  3. 使用automake等命令自动生成Makefile文件 (转载)

    使用automake等命令自动生成Makefile文件   Linux下编程时,为了方便编译,往往使用Makefile文件自动完成编译,但是Makefile文件本身的书写十分复杂,规则很多.好在Lin ...

  4. 程序自动生成Dump文件

    前言:通过drwtsn32.NTSD.CDB等调试工具生成Dump文件, drwtsn32存在的缺点虽然NTSD.CDB可以完全解决,但并不是所有的操作系统中都安装了NTSD.CDB等调试工具.了解了 ...

  5. Makefile自动生成头文件依赖

    前言 Makefile自动生成头文件依赖是很常用的功能,本文的目的是想尽量详细说明其中的原理和过程. Makefile模板 首先给出一个本人在小项目中常用的Makefile模板,支持自动生成头文件依赖 ...

  6. 程序自动生成Dump文件()

    前言:通过drwtsn32.NTSD.CDB等调试工具生成Dump文件, drwtsn32存在的缺点虽然NTSD.CDB可以完全解决,但并不是所有的操作系统中都安装了NTSD.CDB等调试工具.了解了 ...

  7. 文件参数化-utp框架之根据yaml文件自动生成python文件+utp运行用例

    根据yaml文件自动生成python文件 utp框架: bin目录:存放执行文件(run.py) cases目录:存放生成的用例的python文件(该目录下的文件为根据data目录下的测试用例生成的p ...

  8. C# protobuf自动更新cs文件

    网上的教程大都是手动通过protoc编译, 比较难用 给当前工程添加"Google.Protobuf"和"Grpc.Tools"的引用(通过nuget), 然后 ...

  9. Makefile中自动生成头文件依赖

    为什么需要自动生成头文件依赖? 编译单个源文件时,需要获取文件中包含的头文件的信息,但是一般的Makefile不会在规则中明确写明文件依赖的头文件,所以单独修改头文件后,不会导致包含头文件的源文件重新 ...

  10. Wix 安装部署(一)同MSBuild 自动生成打包文件

    因为项目需要,最近在研究Wix打包部署,园子里也有一些关于wix的博客,方方面面,讲的点各不同.我自己也在测试过程中,写下过程,以供参考.最新版本WiX Toolset v3.7,如何安装的就不说了, ...

随机推荐

  1. 分享我对DiscuzQ这款现代化开源轻社区的二次开发成果。DiscuzQ依然是站长的最佳选择!

    简要说一下二开的功能:贴文列表样式优化.增加国内 AI 大模型功能.增加社区 AI 助手(会自动发帖和回帖).编辑器功能优化.pc 端导航优化.h5 端导航优化.修复各种加载不出来加载缓慢的问题等等细 ...

  2. ASP.NET Core Web API设置响应输出的Json数据格式的两种方式

    前言 在ASP.NET Core Web API中设置响应输出Json数据格式有两种方式,可以通过添加System.Text.Json或Newtonsoft.JsonJSON序列化和反序列化库在应用程 ...

  3. java 405_Http状态405-方法不允许

    解决方法: 删除下列代码. super.doGet(req.resp); super.doPost(req.resp); 分析: 405错误一般指请求method not allowed 错误. 请求 ...

  4. python的列表、元组

    列表(list):是Python中最常用的数据类型之一,字符串里面包含元素的是 一个个的字符,并且字符串是不可能更改的,然而列表不一样,他的每个元素都 可以是任何python类型,而且是可以被更改的 ...

  5. idea的maven

    在我学习springMvc时一直报一个错,后来发现是maven一直出错导致的 这个maven是idea系统自己的maven,用着用着发现依赖项不见了,怎么导入坐标都导不进去,导致在创建maven项目时 ...

  6. 开源不挣钱?这个项目上线半年月入超 30w

    很兴奋的告诉大家,Sealos 自从 6 月份上线以来,仅半年时间注册用户已经突破 7万,月收入超过 30w,本文来向大家介绍我们是怎么做开源商业化的.每月平均增速超过 40%,而且这些收入大部分来自 ...

  7. 安卓之DocumentsProvider应用场景以及优劣分析

    文章摘要 本文深入探讨了安卓DocumentsProvider的应用场景,分析了其优势与不足,并提供了简单的代码实现.DocumentsProvider是安卓系统中用于文件存储与访问的关键组件,为应用 ...

  8. Charles的奇巧淫技

    大家好,我是 dom 哥.今天讨论一下 Charles 的高级用法. Charles 是 mac 电脑的一个网络代理软件,也是我平时开发常用的一个工具,用过的都说好. 本文不是 Charles 的入门 ...

  9. Python——第三章:函数的返回值

    函数的返回值: 函数执行之后. 会给调用方一个结果. 这个结果就是返回值 关于return:        函数只要执行到了return. 函数就会立即停止并返回内容. 函数内的return的后续的代 ...

  10. 年底了,网站被挂马了,关于IIS被陌生DLL劫持(新人发帖,写的不好的地方,请多多担待)

    一上班被分到两个需要杀毒的站点,情况是SEO被劫持 出现一些博彩信息,但是打开确实正常内容,使用站长工具的网站被黑检测功能,发现网站的HEAD前面加载一对加密的东西 一开始我使用D盾扫描网站,删除了一 ...