CMAKE学习系列(002)--- 如何添加宏定义

news/2025/3/17 23:09:59/

CMAKE中添加宏定义

文章目录

  • CMAKE中添加宏定义
    • 1. 使用 `add_definitions()`
    • 2. 使用 `target_compile_definitions()`
    • 3. 使用 `add_compile_options()`
    • 4. 用 CMake 命令行传递宏定义
    • 5. 定义带值的宏
    • 6. 使用 `configure_file()` 定义宏
    • 总结

在 CMake 中添加宏定义有多种方式,主要通过 add_definitions()target_compile_definitions() 来实现宏定义。这里是几种常用的方法:


1. 使用 add_definitions()

add_definitions() 用来为整个项目或者全局范围内添加宏定义,适合对所有目标都生效的宏。

add_definitions(-DENABLE_DEBUG)

🔹 示例

add_definitions(-DDEBUG_MODE)  # 定义 DEBUG_MODE 宏

编译后相当于每个文件都带有 -DDEBUG_MODE 选项。


2. 使用 target_compile_definitions()

target_compile_definitions() 用于 指定目标 的宏定义,控制更加精确,通常推荐用这种方式。

target_compile_definitions(<target> PUBLIC ENABLE_DEBUG)

🔹 示例

target_compile_definitions(my_executable PRIVATE ENABLE_LOG)  # 仅对 my_executable 添加 ENABLE_LOG 宏

这里的作用范围可以是:

  • PRIVATE:宏仅适用于目标 my_executable
  • PUBLIC:宏适用于目标 my_executable 及其依赖的目标。
  • INTERFACE:宏仅适用于依赖该目标的其他目标,而不作用于 my_executable 本身。

3. 使用 add_compile_options()

你也可以通过 add_compile_options() 添加编译选项,定义宏:

add_compile_options(-DENABLE_FEATURE)

4. 用 CMake 命令行传递宏定义

你还可以通过 命令行 传递宏定义,直接将宏添加到 CMake 编译过程中:

cmake -DENABLE_DEBUG=ON ..

在 CMake 脚本中可以使用 option() 来控制宏定义:

option(ENABLE_DEBUG "启用调试模式" OFF)if(ENABLE_DEBUG)add_definitions(-DENABLE_DEBUG)
endif()

5. 定义带值的宏

可以定义带有具体值的宏:

add_definitions(-DVERSION_NUMBER=2)

或者用 target_compile_definitions()

target_compile_definitions(my_target PRIVATE VERSION_NUMBER=3)

6. 使用 configure_file() 定义宏

通过 configure_file() 创建一个带宏定义的头文件:

configure_file(config.h.in config.h)# config.h.in 文件内容
#define VERSION_MAJOR @VERSION_MAJOR@
#define VERSION_MINOR @VERSION_MINOR@

CMake 中定义变量:

set(VERSION_MAJOR 1)
set(VERSION_MINOR 0)

总结

  • 全局宏add_definitions(-DMACRO) 适合全局生效。
  • 目标级别宏target_compile_definitions(target PRIVATE MACRO) 更加灵活精确。
  • 命令行宏:可通过 CMake 命令行传递 cmake -DENABLE_DEBUG=ON ..
  • 配置头文件:通过 configure_file() 在头文件中定义宏。

http://www.ppmy.cn/news/1579938.html

相关文章

批量删除或替换 Excel 的 Sheet 工作表

在一个 Excel 文档中通常会包含一个或者多个 Sheet 工作表。我们通常也可以自定义的添加或者删除某些工作表。比如我们想要将某个 Excel 的第一个工作表删除&#xff0c;那我们就需要先通过工具打开 Excel 文档&#xff0c;然后再进行删除操作。单个文件我们这样处理是没有问题…

【Pycharm】Pycharm无法复制粘贴,提示系统剪贴板不可用

我也没有用vim的插件&#xff0c;检查了本地和ubutnu上都没有。区别是我是远程到ubutnu的pycharm&#xff0c;我本地直接控制windowes的pycharm是没问题的。现象是可以从外部复制到pycharm反之则不行。 ctl c ctlv 以及右键 都不行 参考&#xff1a;Pycharm无法复制粘贴&…

JAVA数据库技术(一)

JDBC 简介 JDBC&#xff08;Java Database Connectivity&#xff09;是Java平台提供的一套用于执行SQL语句的Java API。它允许Java程序连接到数据库&#xff0c;并通过发送SQL语句来查询、更新和管理数据库中的数据。JDBC为不同的数据库提供了一种统一的访问方式&#xff0c;使…

Blender-MCP服务源码4-初始化项目解读

Blender-MCP服务源码4-初始化项目解读 上篇文章针对Blender开发框架完成了一个基础模板的搭建&#xff0c;并在Blender中成功进行了运行&#xff0c;那这个初始化项目中是如何进行页面效果呈现的&#xff0c;尝试手动进行功能精简来拆解项目代码 1-核心知识点 1&#xff09;如…

kotlin中的界面组件

我们学习Android第一节应该都是界面的布局&#xff0c;下列我将讲述jet pack中常用的界面组件如下 UI 构建&#xff08;Compose&#xff09;、列表展示&#xff08;RecyclerView&#xff09;、 导航管理&#xff08;Navigation&#xff09;和滑动交互&#xff08;ViewPager2&…

【NLP 36、CRF条件随机场 —— 源码解读】

目录 一、CRF —— 条件随机场&#xff1a; 1.CRF - 转移矩阵 2.发射矩阵 3.结合发射矩阵和转移矩阵 4.CRF —— Loss定义 二、CRF —— 源码解读 1.初始化CRF模块 2.随机初始化CRF参数 3.前向计算 4.维特比算法解码 5.验证输入张量 6.计算分数 7.计算归一化因子 8.解码标签序…

网络运维学习笔记(DeepSeek优化版) 017 HCIA-Datacom综合实验02

文章目录 综合实验2sw3sw4gwcore1&#xff08;sw1&#xff09;core2&#xff08;sw2&#xff09;ISP 综合实验2 sw3 vlan 2 stp mode stp int e0/0/1 port link-type trunk port trunk allow-pass vlan 2 int e0/0/2 port link-type trunk port trunk allow-pass vlan 2 int e…

Apache Pol (excel)

是一个处理微软各种文件格式的开源项目&#xff0c;一般情况下&#xff0c;POI都是用来操作EXCEL文件的 读和写操作 test测试 /* 使用POI操作Excel文件 */ public class POITest { /* 通过POI创建Excel文件并写入文件内容 */ public static void write() throws Exception{ /…