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 会自动处理转义和引号
优势
- 版本控制:在编译时固定版本信息
- 条件编译:基于版本状态启用不同功能
- 调试支持:轻松识别预发布版本
- 自动化构建:与 CI/CD 流程集成
注意事项
- 这些定义是全局的,影响项目中所有目标
- 值中的特殊字符可能需要转义处理
- 建议使用
target_compile_definitions
限制作用域到特定目标