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

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.cmakeCOMMENT "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_MODEstd::cout << "DEBUG_MODE: " << DEBUG_MODE << std::endl;
#endifreturn 0;
}

结果

mkdir build & cd build
cmake ..
make

在这里插入图片描述

DEBUG_MODE: 1

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

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

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

相关文章

VMware虚拟网络连接的三种方式

桥接模式(Bridged) 什么是桥接模式?桥接模式就是将主机网卡与虑拟机虑拟的网卡利用虑拟网桥进行通信。在桥接的作用下&#xff0c;类似于把物理主机虑拟为一个交换机&#xff0c;所有桥接设置的虚拟机连接到这个交换机的一个接口上&#xff0c;物理主机也同样插在这个交换机当…

IDEA MyBatisX插件介绍

一、前言 前几年写代码的时候&#xff0c;要一键生成DAO、XML、Entity基础代码会采用第三方工具&#xff0c;比如mybatis-generator-gui等&#xff0c;现在IDEA或Eclipse都有对应的插件&#xff0c;像IDEA中MyBatisX就是一个比较好用的插件。 二、MyBatisX安装配置使用 MyBa…

HTML光速入门----(有这一篇就够了~!)

前言 因为是博主的平时自己的笔记所以截图和写的方式有点随意&#xff0c;还请大家多多谅解&#xff0c;有什么不对的地方&#xff0c;可以直接在评论区指出问题&#xff0c;感谢大家的指点和阅读我的文章 如果需要这里面演示的html&#xff0c;可以私信我&#xff0c;我会统一…

[黑马程序员Pandas教程]——Pandas快速体验

目录&#xff1a; 为什么要使用Python做数据开发Python在数据开发领域的优势为什么要学习Pandas其他常用Python库介绍主要内容介绍Anaconda安装Anaconda的虚拟环境管理虚拟环境的作用可以通过Anaconda界面创建虚拟环境通过命令行创建虚拟环境通过Anaconda管理界面安装包也可以…

Web3 React项目Dapp获取智能合约对象

上文Web3 整理React项目 导入Web3 并获取区块链信息中&#xff0c;我们在react搭建的dapp中简单拿到了我们区块链中的账号授权信息 那 我们继续 先终端运行 ganache -d将ganache环境起起来 然后 我们运行 dapp 拿到授权列表 回到上文结束的一个状态 然后 我们发布一下自己的…

【设计模式】第22节:行为型模式之“状态模式”

一、简介 状态模式一般用来实现状态机&#xff0c;而状态机常用在游戏、工作流引擎等系统开发中。不过&#xff0c;状态机的实现方式有多种&#xff0c;除了状态模式&#xff0c;比较常用的还有分支逻辑法和查表法。该模式允许对象内部状态改变使改变它的行为。 二、适用场景…

「Qt中文教程指南」如何创建基于Qt Widget的应用程序(四)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文描述了如何使用…

如何选一个质量好的超声波清洗机、超声波清洗机推荐

超声波清洗机的品牌这么多&#xff0c;到底该如何选择一个质量好的超声波清洗机呢&#xff1f;其实选购超声波清洗机还是有讲究的&#xff0c;并非说说超声波清洗机越贵就是越好的&#xff0c;入手之前还是需要多看一下参数之类的&#xff0c;不然容易买回来后悔&#xff0c;作…

dash--项目的前端展示简单基础

1.前置工作 创建虚拟环境&#xff1a; sudo apt-get install python3-venv # 安装 python3 -m venv venv # 在本目录下创建venv虚拟环境&#xff08;也是一个文件夹。如果用不到这个虚拟环境以后就rm -rf venv&#xff09; source venv/bin/activate # 激活虚拟环境临时使用清华…

基于platform驱动模型完成LED驱动的编写

添加设备树文件信息 myplatform{compatible"hqyj,myplatform";//厂商信息&#xff0c;用于驱动端进行匹配interrupt-parent<&gpiof>; //关联中断父节点interrupts<9 0>; //和中断父节点的关系描述符led1-gpio<&gpioe 10 0>; led2-gpio<…

虚拟化的基础知识

目录 虚拟化基础 虚拟化的概念 虚拟化的特征&#xff08;本质&#xff09; 虚拟机的两大派别 VMM讲解 虚拟化中的一些重要概念 VMM的功能以及分类 虚拟化的架构 寄居虚拟化 裸金属虚拟化 操作系统虚拟化 混合虚拟化 虚拟化的三个方向 虚拟化基础 虚拟化的概念 什…

RecyclerView自定义LayoutManager从0到1实践

此前大部分涉及到 RecyclerView 页面的 LayoutManager基本上用系统提供的 LinearLayoutManager 、GridLayoutManager 就能解决&#xff0c;但在一些特殊场景上还是需要我们自定义 LayoutManager。之前基本上没有自己写过&#xff0c;在网上看各种源码各种文章&#xff0c;刚开始…

ps磨皮插件放在哪个文件夹,ps的磨皮插件在哪打开

s磨皮插件一般是第三方软件&#xff0c;通过安装的方式放在ps的相关文件夹中。但也有一些插件是放置在系统软件目录的&#xff0c;不与ps文件放在一起。本文会给大家具体介绍以上两种不同的情况&#xff0c;方便大家了解ps磨皮插件放在哪个文件夹&#xff0c;ps的磨皮插件在哪打…

Java日志组件之三Log4j2漏洞剖析及重现

一、前言 这一篇我们来介绍一下史上第二严重的安全漏洞是个什么情况&#xff0c;原理是什么&#xff0c;如何重现。 二、Log4j2 Lookup机制 Log4j2 Lookup机制最重要的功能就是提供一个可扩展的方式让你可以添加某些特殊的值到日志中。你调用logger.info(name);这样的语句&a…

Java集合操作集锦

原文链接 Java集合操作集锦 集合是最为常见的容器&#xff0c;在日常工作之中经常用到&#xff0c;一些集合的常规操作以及不同的集合之间的转换&#xff0c;虽然看似是基础中的基础&#xff0c;但实践中会发现并不是那么显而易见的&#xff0c;特别是涉及boxing的时候&#x…

B-5:网络安全事件响应

B-5:网络安全事件响应 任务环境说明: 服务器场景:Server2216(开放链接) 用户名:root密码:123456 1.黑客通过网络攻入本地服务器,通过特殊手段在系统中建立了多个异常进程,找出启动异常进程的脚本,并将其绝对路径作为Flag值提交; 通过nmap扫描我们发现开启了22端口,…

Android底层摸索改BUG(二):Android系统移除预置APP

首先我先提供以下博主博文&#xff0c;对相关知识点可以提供理解、解决、思考的 Android 系统如何预装第三方应用以及常见问题汇集android Android.mk属性说明及预置系统app操作说明系Android 中去除系统原生apk的方法 取消预置APK方法一&#xff1a; 其实就是上面的链接3&a…

1-1 prometheus 概述

一、概述 二、特点 三、核心组件 四、基础架构 4.1 Prometheus 的主要模块包含 4.2 运行逻辑 五、Prometheus 与 Zabbix 的对比 六、总结 一、概述 1. 什么是prometheus? 开源系统监控 和 警报工具包受启发于Google的Brogmon监控系统(相似的Kubernetes是从Google的Br…

Webpack打包图片-js-vue

文章目录 一、Webpack打包图片1.加载图片资源的准备2.认识asset module type3.asset module type的使用4.url-loader的limit效果 二、babel1.为什么需要babel2.babel命令行的使用3.babel插件的使用4.babel的预设preset5.babel-loader6.babel-preset 三、加载Vue文件1.编写App.v…

PHP连接SQLServer echo输出中文汉字显示乱码解决方法

1、查询结果有中文会显示乱码。 解决方法一&#xff08;较简单&#xff0c;建议使用&#xff09;&#xff1a; 在php文件最开头写上&#xff1a; header(Content-type: text/html; charsetUTF8); // UTF8不行改成GBK试试&#xff0c;与你保存的格式匹配 <?php header(&q…