[CMake] CMake 进阶
创始人
2025-05-30 22:45:55

CMake 进阶

代码生成

代码生成是指使用一些通用的描述文件,可以自动生成源代码,这样可以更高效。

configure_file

$ tree
.
├── CMakeLists.txt
├── main.cpp  -- 源文件
├── path.h.in  -- 包含 build 文件目录信息的文件
├── ver.h.in  -- 包含项目版本号的文件

在一个文件中需要做变量替换可以使用 configure_file()命令。这个命令的输入和输出主要就是需要修改的源文件和目标文件。

configure_file(ver.h.in ${PROJECT_BINARY_DIR}/ver.h)
configure_file(path.h.in ${PROJECT_BINARY_DIR}/path.h @ONLY)

上面的命令会替换 xxx.h.in 中:${} 语法或者是 @@ 语法的内容,然后会在上面指定的路径下产生一个新的文件。例如:

const char* ver = "${cf_example_VERSION}";const char* path = "@CMAKE_SOURCE_DIR@"

CMakeLists.txt 中需要添加相关内容:

project (cf_example)# set a project version
set (cf_example_VERSION_MAJOR 0)
set (cf_example_VERSION_MINOR 2)
set (cf_example_VERSION_PATCH 1)
set (cf_example_VERSION "${cf_example_VERSION_MAJOR}.${cf_example_VERSION_MINOR}.${cf_example_VERSION_PATCH}")

protobuf

protobuf 是谷歌的一个工具,用户提供 .proto 文件,里面包含对数据结构的描述, Protobuf ccompiler 就会自动将这些文件描述转成 C++ 源码。

  • $ tree
    .
    ├── AddressBook.proto
    ├── CMakeLists.txt
    ├── main.cpp

这里需要依赖Protobuf, 所以环境中需要先安装:

sudo apt-get install protobuf-compiler libprotobuf-dev

有一些变量可以供我们使用:

  • PROTOBUF_FOUND: 如果 protobuf 安装了的话
  • PROTOBUF_INCLUDE_DIRS:protobuf 的头文件路径
  • PROTOBUF_LIBRARIES:protobuf 库

更多地变量内容可以在环境中的 FindProtobuf.make 文件中查看。

PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS AddressBook.proto)
  • PROTO_SRCS :存储了保存自动生成的 .pb.cc 文件的路径信息
  • PROTO_HDRS :存储了保存自动生成的 .pb.h 文件的路径信息
  • AddressBook.proto:提供的 .proto 源文件

上面命令之后就可以使用相关路径来构建我们的项目了:

add_executable(pb_bin main.cpp ${PROTO_SRCS} ${PROTO_HDRS })

完整 CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)# Set the project name
project (protobuf_example)# find the protobuf compiler and libraries
find_package(Protobuf REQUIRED)# check if protobuf was found
if(PROTOBUF_FOUND)message ("protobuf found")
else()message (FATAL_ERROR "Cannot find Protobuf")
endif()# Generate the .h and .cxx files
PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS AddressBook.proto)# Print path to generated files
message ("PROTO_SRCS = ${PROTO_SRCS}")
message ("PROTO_HDRS = ${PROTO_HDRS}")# Add an executable
add_executable(protobuf_examplemain.cpp${PROTO_SRCS}${PROTO_HDRS})target_include_directories(protobuf_examplePUBLIC${PROTOBUF_INCLUDE_DIRS}${CMAKE_CURRENT_BINARY_DIR}
)# link the exe against the libraries
target_link_libraries(protobuf_examplePUBLIC${PROTOBUF_LIBRARIES}
)

其他

在 CMake 中还支持借助其他工具来做代码检查,包括代码风格等。还有单元测试,打包等高阶内容。余下的内容暂时还不需要深入了解,所以这里暂时不继续学习下去了,后续有需要再打开学习。感兴趣的同学可以移步到原项目进行观看。

相关内容

热门资讯

电压放大器在钢筋剥离损伤识别试...   实验名称:钢筋剥离损伤识别试验  研究方向:无损检测  测试目的&#...
MOCO论文前几段精读 MoCo MoCo是CVPR 2020的最佳论文提名,算是视觉领域里,使...
【lua初级篇】基础知识和开发... 文章介绍 文章介绍 简述 工具安装配置和下载 快速看基础知识 一些常用的关键字一览 数据类型 tab...
Yuv422、Nv12转C#B... 1.1、Nv12转Bitmapint w = 1920;int h = 1080;i...
Linux互斥量和信号量的区别... 互斥量和信号量的区别 1.互斥量用于线程的互斥: 互斥:加锁解锁,是指某...
Git 和 GitHub 超入... 1.解决行结束符问题 需要在你的仓库中添加一个.gitattributes文件,标记正...
基于C++的AI五子棋游戏项目... 项目资源下载 基于C++的AI五子棋游戏项目源码压缩包下载地址基于C+...
#浅聊 webSocket (... 如果可以实现记得点赞分享,谢谢老铁~ 一,什么是webso...
Java SE API kno... Java SE API know how 字符串 紧凑字符串 java8 无论字符串的编码ÿ...
常用的VB函数 数学函数函数说明示例Sin(N)返回自变量N的正弦值Sin(0)=0 N为弧度Cos(N)返...
C++ 机房预约系统(五):管... 7.3 显示功能 功能描述: 显示学生信息或教师信息 功能实现: voi...
PIC单片机的一些问题 error 1347 can't find 0x16 words (0x16 withtotal) ...
完美日记母公司再度携手中国妇基... 撰稿 | 多客 来源 | 贝多财经 当春时节,梦想花开。和煦的三月暖阳,...
GDPU C语言 天码行空3 1. 分段函数 #includeint main(){double x,y;scanf("%lf",...
【瑞萨 MCU】开发环境搭建之... e2 studio e2 studio(简称为 e2 或 e2s)是瑞萨...
C语言内联汇编 之前我们介绍了一种C语言与汇编代码混合编程方式,就是两个文件分开编写,分...
Linux 网络编程学习笔记—... 一、TCP 服务的特点 传输层协议主要有 TCP 协议和 UDP 协议,前者相对于后者...
KubeSphere All ... KubeSphere All in one安装配置手册 1. 初始化 1.1 配置apt源 # vi...
学习软件测试怎么能缺少练手的软... 你好,我是凡哥。 最近收到许多自学自动化测试的小伙伴私信,学习了理论知识...
【面试题】浅谈css加载是否会... 大厂面试题分享 面试题库前后端面试题库 (面试必备) 推荐:...
直播带货系统开发的关键点、代码... 时下,直播的热度依然不减,而它的产物之一:直播带货系统&#...
一文读懂强化学习! 一.了解强化学习1.1基本概念强化学习是考虑智能体(Agent)与环境&...
Spring Cloud之一:... 目录 环境 Eureka工程的创建步骤 系列目录(持续更新。。。) S...
golang实现守护进程(2) 前言golang实现守护进程,包含功能:1. 守护进程只创建一次2. 平...
url 格式详解 统一资源定位系统(uniform resource locator; url ...
elasticsearch7.... elasticsearch版本:7.17.3 目标:实现对类型为text...
SpringBoot 加载系统... 开发环境: IDEA 2022.1.4+ MyBatis         代码参考:spri...
交换机概念和知识和命令 目录 一、华为交换机基础学习的一些重要概念和知识 二、交换机常用命令大全 三、不常用的交换机命令 ...
什么是 JavaScript ... 本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻࿰...
【C++】C++11——lam... 文章目录一、Lambda表达式引入二、Lambda表达式语法三、Lambda表达式交换两个值四、La...