【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 限制作用域到特定目标
复制代码
相关推荐
十五年专注C++开发3 分钟前
windows和linux使用system启动进程是一样的吗?
linux·c++·windows·system
Dshuishui4 分钟前
VSCode 环境下编译运行 C++ 项目
c++·ide·vscode
liu****13 分钟前
第15届省赛蓝桥杯大赛C/C++大学B组
开发语言·数据结构·c++·算法·蓝桥杯·acm
无缘之缘25 分钟前
蓝桥杯手把手教你备战(C/C++ B组)(最全面!最贴心!适合小白!)
c语言·c++·算法·蓝桥杯
OTWOL29 分钟前
C语言操作符终极揭秘:表达式求值秘籍
c语言·开发语言·c++
Q741_14729 分钟前
每日一题 3740. 三个相等元素之间的最小距离 I 3741. 三个相等元素之间的最小距离 II 模拟 哈希表 C++ 题解
c++·算法·leetcode·模拟·数组·哈希表
Ancelin安心31 分钟前
西工大noj(C/C++)100题参考题解及注意事项(2024)
c语言·c++·ide·windows·vscode·算法
Sarvartha34 分钟前
C++ STL 队列(queue)学习笔记
c++
李日灐39 分钟前
【优选算法3】二分查找经典算法面试题
开发语言·c++·后端·算法·面试·二分查找·双指针
Z1Jxxx1 小时前
C++ P1151 子数整数
开发语言·c++·算法