当前位置: 首页 > news >正文

【CMakeLists.txt】CMake 编译定义带值参数详解

add_compile_definitions(LC_VERSION=2.2.2.5-alpha)
add_compile_definitions(LC_PRERELEASE=true)

指令作用

add_compile_definitions 用于向编译器添加带值的预处理器定义,相当于在代码中使用 #define NAME VALUE 指令。

1. add_compile_definitions(LC_VERSION=2.2.2.5-alpha)

作用:定义 LC_VERSION 宏并赋值为字符串 “2.2.2.5-alpha”

  • 这会在编译过程中定义 LC_VERSION 预处理器宏
  • 等价于在 C/C++ 代码中写入:
    #define LC_VERSION "2.2.2.5-alpha"
    
  • 用于定义版本号信息

应用场景

  • 在代码中嵌入版本信息
  • 条件编译基于版本的功能
  • 运行时版本检查

代码使用示例

#include <iostream>int main() {std::cout << "Library version: " << LC_VERSION << std::endl;#ifdef LC_VERSIONstd::cout << "Compiled with version: " << LC_VERSION << std::endl;#endifreturn 0;
}

2. add_compile_definitions(LC_PRERELEASE=true)

作用:定义 LC_PRERELEASE 宏并赋值为字符串 “true”

  • 这会在编译过程中定义 LC_PRERELEASE 预处理器宏
  • 等价于在 C/C++ 代码中写入:
    #define LC_PRERELEASE "true"
    
  • 用于标记预发布版本状态

应用场景

  • 启用或禁用预发布版本特有的功能
  • 添加预发布版本的特殊行为
  • 调试或测试功能开关

代码使用示例

#include <iostream>int main() {#ifdef LC_PRERELEASEstd::cout << "This is a pre-release version: " << LC_PRERELEASE << std::endl;// 预发布版本特有的代码enableExperimentalFeatures();showBetaWarning();#endifreturn 0;
}

完整 CMake 示例

cmake_minimum_required(VERSION 3.12)
project(MyLibrary)# 添加带值的编译定义
add_compile_definitions(LC_VERSION=2.2.2.5-alpha)
add_compile_definitions(LC_PRERELEASE=true)add_library(MyLibrary src/mylib.cpp)# 也可以合并为一行
add_compile_definitions(LC_VERSION=2.2.2.5-alphaLC_PRERELEASE=true
)

实际应用场景

版本管理和功能标记

// 在头文件中定义基于版本的功能
#ifndef LC_VERSION#error "LC_VERSION not defined"
#endifvoid initializeLibrary() {std::cout << "Initializing library version: " << LC_VERSION << std::endl;#ifdef LC_PRERELEASEif (strcmp(LC_PRERELEASE, "true") == 0) {enableDebugLogging();collectUsageStatistics();}#endif
}

替代语法比较

# 现代 CMake 方式(推荐)
add_compile_definitions(LC_VERSION=2.2.2.5-alpha LC_PRERELEASE=true)# 传统方式(不推荐)
add_definitions(-DLC_VERSION="2.2.2.5-alpha" -DLC_PRERELEASE="true")# 目标特定定义(更精确)
target_compile_definitions(MyLibrary PRIVATE LC_VERSION=2.2.2.5-alphaLC_PRERELEASE=true
)

字符串值处理说明

  • 等号右侧的值:会被当作字符串字面量处理
  • 空格处理:如果值包含空格,需要使用引号:NAME="value with spaces"
  • 特殊字符:CMake 会自动处理转义和引号

优势

  1. 版本控制:在编译时固定版本信息
  2. 条件编译:基于版本状态启用不同功能
  3. 调试支持:轻松识别预发布版本
  4. 自动化构建:与 CI/CD 流程集成

注意事项

  • 这些定义是全局的,影响项目中所有目标
  • 值中的特殊字符可能需要转义处理
  • 建议使用 target_compile_definitions 限制作用域到特定目标
http://www.dtcms.com/a/516103.html

相关文章:

  • 系统集成项目管理工程师第五章:软件工程核心笔记(精简版)
  • nvm切换node版本-jenkins上编译
  • 人和做网站架设网站费用
  • 支付商城网站制作韩国出线了吗
  • Leetcode 34
  • UDP的一次双向通信
  • 电源 东莞网站建设网站做的好不好数据
  • C数据结构--线性表(顺序表|单链表|双向链表)
  • IoT电子价签:打造智能化商超秋冬新品促销新体验
  • Docker基础【Ubuntu安装/Windows安装】
  • 使用仓颉开发一个简单的http服务
  • 企业网站托管后果网站建设营销外包公司排名
  • 在linux系统中使用通用包安装 Mysql
  • DeepSeek OCR:重新定义AI文档处理的“降本增效”新范式
  • JAVAEE阶段学习指南
  • 针对stm32f103 MCU的延时方法及函数深入探讨
  • 【完整源码+数据集+部署教程】【天线&水】舰船战舰检测与分类图像分割系统源码&数据集全套:改进yolo11-repvit
  • 查找算法-顺序查找
  • Linux系统中CoreDump的生成与调试
  • 关于数据库和分库分表
  • 服务器和网站空间云端设计高端网站建设
  • yolo v11 pose 推理部署实战 2025
  • 设计模式之:装饰器模式
  • 用户态和内核态切换开销详解(了解即可)
  • Android触屏TP驱动事件上报以及多点触摸
  • 上海微信小程序网站建设教做西餐的网站
  • 一文读懂YOLOv4:目标检测领域的技术融合与性能突破
  • 深圳企业网站建设报价泰安建设网站
  • vllm系统架构图解释
  • 上海做网站公司做网站的公司免费域名注册工具