CMake:构建时为特定目标运行自定义命令

news2025/2/27 23:03:33

CMake:构建时为特定目标运行自定义命令

  • 导言
  • 项目结构
  • 相关源码
  • 结果

导言

add_custom_command 是 CMake 中用于添加自定义构建规则的命令,通常用于在编译项目时执行一些自定义操作,例如生成文件、运行脚本等。

项目结构

.
├── CMakeLists.txt
├── generate_config.cmake
└── main.cpp

项目地址:

https://gitee.com/jiangli01/tutorials/tree/master/cmake-tutorial/chapter5/03

相关源码

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)

project(test_command)

# 设置需要生成的头文件的路径
set(CONFIG_HEADER ${CMAKE_BINARY_DIR}/config.h)

# 添加一个自定义命令来生成头文件
add_custom_command(
    OUTPUT ${CONFIG_HEADER}
    COMMAND ${CMAKE_COMMAND}
        -DOUTPUT_FILE=${CONFIG_HEADER}
        -P ${CMAKE_CURRENT_SOURCE_DIR}/generate_config.cmake
    COMMENT "Generating config.h"
)

# 将生成的头文件的路径添加到包含目录
include_directories(${CMAKE_BINARY_DIR})

# 添加可执行文件
add_executable(test_app main.cpp)

# 将自定义命令的输出文件添加为依赖项
add_dependencies(test_app config_h_target)

# 定义一个自定义目标以便其他目标可以依赖它
add_custom_target(config_h_target DEPENDS ${CONFIG_HEADER})

# 将自定义目标添加到 ALL 阶段,以确保在每次构建时都生成 config.h
add_dependencies(test_app config_h_target)

generate_config.cmake

# 你可以在这里定义所需的宏
set(APP_NAME "TJUApp")
set(APP_VERSION "1.0.0")
set(DEBUG_MODE 1)

# 生成 config.h 头文件
file(WRITE ${OUTPUT_FILE} "#ifndef CONFIG_H\n")
file(APPEND ${OUTPUT_FILE} "#define CONFIG_H\n")
file(APPEND ${OUTPUT_FILE} "\n")

# 添加宏定义
file(APPEND ${OUTPUT_FILE} "#define APP_NAME \"${APP_NAME}\"\n")
file(APPEND ${OUTPUT_FILE} "#define APP_VERSION \"${APP_VERSION}\"\n")

if (DEBUG_MODE)
    file(APPEND ${OUTPUT_FILE} "#define DEBUG_MODE 1\n")
else ()
    file(APPEND ${OUTPUT_FILE} "#define DEBUG_MODE 0\n")
endif ()

# 结束文件
file(APPEND ${OUTPUT_FILE} "\n#endif\n")
#include <iostream>
#include "config.h"
int main() {
#ifdef DEBUG_MODE
  std::cout << "DEBUG_MODE: " << DEBUG_MODE << std::endl;
#endif
  return 0;
}

结果

mkdir build & cd build
cmake ..
make

在这里插入图片描述

DEBUG_MODE: 1

最后,祝大家变得更强!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《web前端开发技术》初识Vue + 第一个 Vue程序:hello world

目录 2.1 Vue 简述 2.1.1 什么是 Vue 2.1.2 为什么选择 Vue 2.2 Vue 的三种安装方式 2.1 Vue 简述 Vue 在 JavaScript 前端开发库领域属于后来者&#xff0c;其他前端开发库有 jQuery、ExtJS、 Anguals、React 等。 2.1.1 什么是 Vue &#x1f636;‍&#x1f32b;️Vue (…

树结构及其算法-二叉树遍历

目录 树结构及其算法-二叉树遍历 一、中序遍历 二、后序遍历 三、前序遍历 C代码 树结构及其算法-二叉树遍历 我们知道线性数组或链表都只能单向从头至尾遍历或反向遍历。所谓二叉树的遍历&#xff08;Binary Tree Traversal&#xff09;&#xff0c;简单的说法就是访问树…

Aqua Data Studio 2023.1

为什么选择 Aqua Data Studio&#xff1f; 随着数据在业务中的作用不断发展&#xff0c;组织需要一种有效的方法来简化复杂的技术任务并缩小 IT 和业务团队之间的差距。 使用多个数据库平台不再复杂。使用 Aqua Data Studio 简化您的所有数据管理流程和任务&#xff1a;这是一…

[JavaWeb]——获取请求参数的方式(全面!!!)

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 1.普通类型 1.1原始方式(了解) 1.2springboot方式(推荐) 2.实体类型 2.1简单实体类型 2.2实体类型里还有实体类型(内部类) 3.数组或集合类型 3.1数组 3.2集合 4.&#x1f525;JSON格式 常用 5.日期类型…

CS224W4.3——Random Walk with Restarts

我们讨论了个性化PageRank&#xff0c;它对节点与查询节点S的给定子集(即teleportation set)的接近程度进行排名&#xff0c;以及随机行走(Random Walk)&#xff0c;它对从单个起始节点到对节点接近程度进行随机行走建模。我们将演示这些算法是如何与PageRank的原始定义相关联的…

el-table树状表格末行合计

首先,由于我的表头是动态的,所以就稍微复杂一点 效果图 表头数据格式是这样的 表格的数据格式是这样的 然后用合并的方法,此处就需要递归去计算,根据props去匹配每一列的数据,然后加起来,关键代码 //合计处理getSummaries(param) {const { columns, data } param;const su…

蜂邮个人可以注册吗?注册蜂邮EDM的教程!

被问了100遍的邮件营销系统蜂邮EDM个人该怎么注册&#xff1f; 蜂邮EDM是一个强大的邮件营销系统&#xff0c;不仅适用于企业&#xff0c;个人用户也可以注册并使用。如果你一直在思考如何注册蜂邮EDM&#xff0c;不要担心&#xff0c;今天我将为你提供一份详细的注册教程&…

基于深度学习的口罩佩戴检测

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介二、功能三、基于深度学习的口罩佩戴检测四. 总结 一项目简介 基于深度学习的口罩佩戴检测是一种利用计算机视觉技术和深度学习算法进行口罩佩戴情况检测的…

小白怎么学习性能测试?一文7个知识点带你成功入门!

1.什么是性能测试 性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试&#xff0c;两者可以结合进行。通过负载测试&#xff0c;确定在各种工作负载下系统的性能&#xff0c;目标是测试当负…

3.15每日一题(分部积分求不定积分)

注意看分子分母的变化&#xff0c;可以相消

mac下载安装jenkins

下载 选择2.1.64版本 &#xff08;需要jdk8&#xff0c;自行下载&#xff0c; &#xff09; https://archives.jenkins.io/war/2.164/jenkins.war 启动 使用命令行启动 java -jar jenkins.war 浏览器访问 IP:8080 或 localhost:8080 &#xff0c;对jenkins进行配置&#xf…

arcgis删除细长图斑的方法

1、有一张图斑数据如下&#xff1a; 如上图&#xff0c;有很多细长的面要素&#xff0c;需要保留的仅是图中的块状要素。 2、首先要将被合并的要素进行拆分&#xff0c;具体拆分步骤如下&#xff1a; 将所有要素选中&#xff0c;点击高级编辑中的拆分按钮。 3、拆分后图斑就…

Linux常用操作及主流服务部署命令

目录 Linux 系统目录 一、常用操作命令 1、目录操作 2、文件内容操作&#xff08;查看日志&#xff0c;更改配置文件&#xff09; 3、压缩和解压缩 4、更改文件权限 二、各服务部署命令 1、增加虚拟内存 2、JDK 2.1 删除系统自带的openjdk 2.2 安装jdk 2.3 删除jd…

【LeetCode】每日一题 2023_11_1 参加会议的最多员工数(没做出来)

文章目录 刷题前唠嗑题目&#xff1a;参加会议的最多员工数题目描述代码与解题思路纳入收藏夹 结语 刷题前唠嗑 好好好&#xff0c;这么玩是吧&#xff0c;11 月刚准备开始刷每日一题&#xff0c;就给我来了一道 hard&#xff0c;我连题目都看不懂他在讲些什么&#xff0c;但是…

深度学习_2 数据操作之数据预处理

数据操作 机器学习包括的核心组件有&#xff1a; 可以用来学习的数据&#xff08;data&#xff09;&#xff1b;如何转换数据的模型&#xff08;model&#xff09;&#xff1b;一个目标函数&#xff08;objective function&#xff09;&#xff0c;用来量化模型的有效性&…

记一次有趣的tp5代码执行

目录 0x00 前言 0x01 基础信息 0x02 突破 base64编码与php://filter伪协议 tp 5 method代码执行的细节 0x03 总结 免费领取安全学习资料包&#xff01;&#xff08;私聊进群一起学习&#xff0c;共同进步&#xff09;​编辑 0x00 前言 朋友之前给了个站&#xff0c;拿了…

一对一发放私密成绩:成绩查询系统全攻略

有没有想过让学生自助查询成绩&#xff1f;介绍一种全新的成绩查询系统&#xff0c;帮你实现一对一发放私密成绩。 一、如何用代码实现学生自助查询成绩&#xff1f; 如果你是一名懂得编程的老师&#xff0c;那么你可以考虑使用Python编写一个简单的成绩查询系统。下面是一个基…

Sqoop的安装和使用

目录 一.安装 二.导入 1.全量导入 一.MySQL导入HDFS 二.MySQL导入Hive 2.增量导入 一.过滤导入hdfs/hive 二.导出 一.安装 1.下载地址&#xff1a;sqoop下载地址 2.解压 tar -zxvf ./sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C ../module/ 3.改名和配置归属权限 #改名…

ChatGPT将迎来巨大更新!变得无所不能!

此次更新&#xff0c;主要是2点&#xff1a; 1、直接可以与PDF和数据文件对话&#xff0c;只需上传即可完成聊天 2、不用来回切换联网、作图功能&#xff0c;已经将这些功能进行了集成&#xff0c;直接在对话中使用即可&#xff0c;比如之前的联网&#xff08;Browse with Bi…

【教程】R语言生物群落(生态)数据统计分析与绘图

查看原文>>>R语言生物群落&#xff08;生态&#xff09;数据统计分析与绘图实践 暨融合《R语言基础》、《tidyverse数据清洗》、《多元统计分析》、《随机森林模型》、《回归及混合效应模型》、《结构方程模型》、《统计结果作图》七合一版本方案 R 语言作的开源、自…