一个cmakelist的例子(自动处理多个proto)

news/2024/9/20 0:40:02/文章来源:https://www.cnblogs.com/xcywt/p/18418411

背景:

由于项目需要,把所有的proto文件放在了统一的文件夹中,为了方便更新以及加快编译速度,要把这个proto自动转成.cc .pb.h文件,再编译成so。

为此,写了个cmakelist.txt。

 

主要功能:

1)自动遍历指定目录下所有proto文件,调用ptotoc生成.cc文件,如下图:cc文件存放在上一级目录,目录结构类似。

2)编译成so。

 

目录结构:

 其中common、geometry等文件夹里面放的都是.proto

上代码CMakeLists.txt:

cmake_minimum_required(VERSION 3.12)
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
project(dros_proto)set(dp_MAJOR_VERSION 0)
set(dp_MINOR_VERSION 2)
set(dp_PATCH_VERSION 0)
set(dp_VERSION "${dp_MAJOR_VERSION}.${dp_MINOR_VERSION}.${dp_PATCH_VERSION}")set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../lib)file(GLOB protobuf_files${CMAKE_CURRENT_SOURCE_DIR}/common/*.proto${CMAKE_CURRENT_SOURCE_DIR}/geometry/*.proto${CMAKE_CURRENT_SOURCE_DIR}/navigation/*.proto${CMAKE_CURRENT_SOURCE_DIR}/sensor/*.proto${CMAKE_CURRENT_SOURCE_DIR}/tutorials/*.proto
)set(3rd_DIR "${PROJECT_SOURCE_DIR}/../../thirdparty")
set(Protobuf_DIR "${3rd_DIR}/protobuf3.14.0.0")set(PROTO_META_BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../proto_cpp)
list(APPEND PROTO_FLAGS -I${CMAKE_CURRENT_SOURCE_DIR}/ -I${Protobuf_DIR}/src/)if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64")set(ARCH_TYPE x64)
elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64")set(ARCH_TYPE arm64)
endif()
message("arch type: ${CMAKE_SYSTEM_PROCESSOR}")set(PROTOC_EXE ${Protobuf_DIR}/bin/${ARCH_TYPE}/protoc-3.14.0.0)
message("proto_exe = ${PROTOC_EXE}")foreach(FIL ${protobuf_files})get_filename_component(FIL_WE ${FIL} NAME_WE)string(REGEX REPLACE ".+/(.+)\\..*" "\\1" FILE_NAME ${FIL})string(REGEX REPLACE "(.+)\\${FILE_NAME}.*" "\\1" FILE_PATH ${FIL})string(REGEX MATCH "(/proto/.*)" MATCH_PATH ${FILE_PATH})# message("DDD: ${FILE_PATH}: ${MATCH_PATH}")string(REPLACE "/proto/" "/" OUT_PATH ${MATCH_PATH})# message("SRC_CPP: ${PROTO_META_BASE_DIR}:${OUT_PATH}:${FIL_WE}.pb.cc")
set(PROTO_SRCS "${PROTO_SRCS};${PROTO_META_BASE_DIR}${OUT_PATH}${FIL_WE}.pb.cc")set(PROTO_HDRS "${PROTO_HDRS};${PROTO_META_BASE_DIR}${OUT_PATH}${FIL_WE}.pb.h")EXECUTE_PROCESS(COMMAND ${PROTOC_EXE} ${PROTO_FLAGS} --cpp_out=${PROTO_META_BASE_DIR} ${FIL})
endforeach()include_directories(${Protobuf_DIR}/src)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../proto_cpp)add_library(${PROJECT_NAME} SHARED${PROTO_SRCS}${PROTO_HDRS}
)
set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${dp_VERSION} SOVERSION ${dp_MAJOR_VERSION})

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/799339.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop(十三)HDFS DataNode

一、DataNode工作机制1、一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳 2、DataNode启动后向NameNode注册,通过后,周期性(6小时)的向NameNode上报所有的块信息 3、心跳是每3秒一…

Hadoop(十三)DataNode

一、DataNode工作机制1、一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳 2、DataNode启动后向NameNode注册,通过后,周期性(6小时)的向NameNode上报所有的块信息 3、心跳是每3秒一…

Hadoop(十二)NameNode 和 SecondaryNameNode

一、NN和2NN工作机制 1、NameNode中的元数据存储在哪里?存储在NameNode节点的磁盘中会导致效率过低,因为经常需要进行随机访问和响应客户请求;存储在内存中,一旦元数据丢失,整个集群就无法工作,也不合适。因此产生了在磁盘中备份元数据的FsImage。 引入Edits文件(只进行…

高效数据移动指南 | 如何快速实现数据库 MySQL 到 MongoDB 的数据同步?

本专题将基于实践经验,从常见需求入手,为大家介绍热门数据源与数据目标之间的数据同步(全量/增量)如何实现?了解如何快速搭建数据管道,实现数据的高效迁移与无缝同步。本文教程为:MySQL → MongoDB 的数据同步任务。在现代企业中,数据无处不在,贯穿于各个业务环节和系…

一文带你精通二项式反演!不服来看!

前言 原题:《二项式反演学习笔记》。 这里有我关于二项式反演的一些思考和领会,包含理论推导和在信息学竞赛中的应用。网络上的教程都太潦草了,难以深入理解。因此,这里将以详细的证明为主,介绍二项式反演在 OI 中的使用。 如果你只想快速浏览结论,可以点击这里查看结论。…

解决ZBLOG网站运行中出现JavaScript加载失败问题

当 Z-Blog 网站运行中出现“JavaScript 加载失败”的问题时,可能的原因有几个方面,包括但不限于插件冲突、HTTPS 配置问题、CDN 问题等。以下是针对这些问题的一些解决方案: 1. 插件冲突问题描述:某些插件可能与 Z-Blog 核心或其他插件存在冲突,导致 JavaScript 无法正常加…

zblog 404.php 怎么写,zblogphp主题错误之模板选择

在 Z-Blog PHP 中,如果你想要自定义 404 页面(即当用户访问不存在的页面时显示的页面),你可以创建一个 404.php 文件。下面是创建一个简单的 404 页面的基本步骤和示例代码: 创建 404.php 文件创建文件:在你的主题目录中创建一个名为 404.php 的文件。 添加基本 HTML 结构…

zblog上传安装主题插件不成功的原因和解决办法

当在 Z-Blog 中上传安装主题或插件不成功时,可能的原因有很多。下面列出了一些常见的原因及相应的解决办法: 1. 文件大小超出限制问题描述:上传的文件包可能超出了服务器允许的最大文件大小。 解决方法:检查后台的“全局设置”中的“允许上传文件的大小”,并适当增大这个值…

本地调试多服务

本地idea如果同一个服务,想开多个服务,只需要改下端口重新启动,配置如下 1、打开idea的Services (老版本的idea应该是Run bashboard) 2、如图所示的两个stockApplication就是相同的服务,不同的端口 3、点击其中一个StockApplication8082右击找到Copy Configuration 这样…

zblog显示Allowed memory size of 6553652 bytes exhauste

当 Z-Blog 显示 “Allowed memory size of 6553652 bytes exhausted” 错误时,这意味着 PHP 的内存限制已达到上限。这种错误通常发生在处理大量数据或执行复杂操作时。以下是解决此问题的一些常见步骤: 1. 增加 PHP 内存限制 方法一:修改 php.ini 文件定位 php.ini 文件找到…

zblog应用中心连接失败的解决方案

当 Z-Blog 应用中心连接失败时,这通常意味着服务器无法正常访问应用中心的服务器。以下是解决此类问题的一些常见步骤: 1. 检查网络连接问题描述:网络连接可能不稳定或中断。 解决方法:确认服务器可以正常访问互联网。 尝试 ping 应用中心的服务器地址,例如:shping appce…

C++信奥老师解一本通题 1164:digit函数

​ 【题目描述】在程序中定义一函数digit(n,k),它能分离出整数n从右边数第k个数字。【输入】正整数n和k。【输出】一个数字。【输入样例】 31859 3 【输出样例】 8#include <iostream> using namespace std; int digit(long long n,int k) {if(k==1)return n%10;return …