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

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++ 代码中写入:

    cpp 复制代码
    #define LC_VERSION "2.2.2.5-alpha"
  • 用于定义版本号信息

应用场景

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

代码使用示例

cpp 复制代码
#include <iostream>

int main() {
    std::cout << "Library version: " << LC_VERSION << std::endl;
    
    #ifdef LC_VERSION
        std::cout << "Compiled with version: " << LC_VERSION << std::endl;
    #endif
    
    return 0;
}

2. add_compile_definitions(LC_PRERELEASE=true)

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

  • 这会在编译过程中定义 LC_PRERELEASE 预处理器宏

  • 等价于在 C/C++ 代码中写入:

    cpp 复制代码
    #define LC_PRERELEASE "true"
  • 用于标记预发布版本状态

应用场景

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

代码使用示例

cpp 复制代码
#include <iostream>

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

完整 CMake 示例

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-alpha
    LC_PRERELEASE=true
)

实际应用场景

版本管理和功能标记

cpp 复制代码
// 在头文件中定义基于版本的功能
#ifndef LC_VERSION
    #error "LC_VERSION not defined"
#endif

void initializeLibrary() {
    std::cout << "Initializing library version: " << LC_VERSION << std::endl;
    
    #ifdef LC_PRERELEASE
    if (strcmp(LC_PRERELEASE, "true") == 0) {
        enableDebugLogging();
        collectUsageStatistics();
    }
    #endif
}

替代语法比较

cmake 复制代码
# 现代 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-alpha
        LC_PRERELEASE=true
)

字符串值处理说明

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

优势

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

注意事项

  • 这些定义是全局的,影响项目中所有目标
  • 值中的特殊字符可能需要转义处理
  • 建议使用 target_compile_definitions 限制作用域到特定目标
复制代码
相关推荐
fpcc42 分钟前
ubuntu26环境下的开发环境安装处理
c++·并行编程
charlie1145141912 小时前
Cinux · 第一次跳进 Ring 3:用户态与特权隔离
开发语言·c++·操作系统·开源项目
别动我齐刘海2 小时前
机器学习基础2——C++、OpenCV、点云、Open3D
c++·人工智能·opencv·机器学习·计算机视觉·机器人·ros2
躺不平的理查德3 小时前
Windows C++ 第三方库使用流程备忘录--OpenCV
开发语言·c++
余额瞒着我当琳3 小时前
C++STL容器string--迭代器,string的接口,string的遍历,访问方式
c++
郭涤生3 小时前
rootfs 详解与裁剪优化记录
linux·c++·bsp
小小龙学IT4 小时前
C++ std::vector 底层实现深度解析:内存布局、扩容策略、移动语义与迭代器失效
开发语言·c++·算法
noipp4 小时前
推荐题目:洛谷 P16689 出征
java·开发语言·数据结构·c++·算法·洛谷·luogu
码匠许师傅4 小时前
【C++ 面试真题】聊聊 volatile 和 mutable
开发语言·c++·面试
(Charon)4 小时前
【C++】线程安全队列(二):生产者消费者模型与 condition_variable 阻塞等待
c语言·开发语言·c++