CMake变量赋值
CMake变量赋值
- set / unset
- **变量的区别**
- 1、普通变量
- 2、CACHE变量
- 3、ENV变量
- 4、父作用域
set / unset
| 命令 | 语法 | 说明 |
|---|---|---|
set | set(<变量> <值> [CACHE <类型> <描述>] [FORCE]) | 设置变量 |
unset | unset(<变量> [CACHE]) | 删除变量 |
变量的区别
| 特性 | 普通变量 | Cache 变量 | ENV 变量 |
|---|---|---|---|
| 作用域 | 当前目录/函数 | 全局(项目) | CMake进程 |
| 持久化 | ❌ 否 | ✅ 是(CMakeCache.txt) | ❌ 否 |
| 系统可见 | ❌ 否 | ❌ 否 | ⚠️ 子进程可见 |
| 生命周期 | 单次运行 | 跨运行保持 | CMake进程期间 |
| 修改语法 | set(VAR ...) | set(VAR ... CACHE ...) | set(ENV{VAR} ...) |
| 读取语法 | ${VAR} | ${VAR} | $ENV{VAR} |
1、普通变量
set(<name> <value>)unset(<name>)
# ── 普通变量 ──────────────────────────────────set(USER_NAME"张三")message(STATUS"名字:${USER_NAME}")unset(USER_NAME)message(STATUS"删除后名字:${USER_NAME}")# ── 列表变量 ──────────────────────────────────set(SRC_FILES main.cpp utils.cpp config.cpp)message(STATUS"源文件:${SRC_FILES}")unset(SRC_FILES)message(STATUS"删除后源文件:${SRC_FILES}")2、CACHE变量
CACHE 类型使用说明
1、命令行传参覆盖:
-D{name}={value}
2、FORCE强制覆盖
| 类型 | 说明 | 示例 |
|---|---|---|
STRING | 字符串 | set(NAME "abc" CACHE STRING "名称") |
BOOL | 布尔值 ON/OFF | set(ENABLE_TEST ON CACHE BOOL "启用测试") |
PATH | 目录路径 | set(DATA_DIR "/data" CACHE PATH "数据目录") |
FILEPATH | 文件路径 | set(CFG_FILE "/etc/app.conf" CACHE FILEPATH "配置文件") |
INTERNAL | 内部变量,不在GUI显示 | set(VERSION "1.0" CACHE INTERNAL "版本") |
# ── CACHE 变量(可被 -D 命令行覆盖)──────────# CACHE, STRING变量set(MY_PORT8080CACHE STRING"CACHE变量STRING类型")# cmake -DMY_PORT=9090 .. 可覆盖message(STATUS"MY_PORT:${MY_PORT}")# CACHE, BOOL变量set(USE_USER_LIBS ON CACHE BOOL"CACHE变量BOOL类型")message(STATUS"USE_USER_LIBS:${USE_USER_LIBS}")unset(USE_USER_LIBS CACHE)# CACHE, PATH变量set(USE_USER_DIR"/usr/local"CACHEPATH"CACHE变量PATH类型")message(STATUS"USE_USER_DIR:${USE_USER_DIR}")unset(USE_USER_DIR CACHE)# CACHE, FILEPATH变量set(USE_USER_CFG_FILE"/usr/local/123.cfg"CACHE FILEPATH"CACHE变量FILEPATH类型")message(STATUS"USE_USER_CFG_FILE:${USE_USER_CFG_FILE}")unset(USE_USER_CFG_FILE CACHE)# CACHE, INTERNAL变量set(INTERNAL_VAR"hello-world"CACHE INTERNAL"CACHE变量INTERNAL类型")message(STATUS"INTERNAL_VAR:${INTERNAL_VAR}")unset(INTERNAL_VAR CACHE)# ── FORCE 强制覆盖 CACHE 变量 ─────────────────set(MY_PORT7070CACHE STRING"服务端口号"FORCE)message(STATUS"强制覆盖MY_PORT:${MY_PORT}")unset(MY_PORT CACHE)3、ENV变量
set(ENV{MY_ENV}"hello")message(STATUS"环境变量:$ENV{MY_ENV}")unset(ENV{MY_ENV})message("取消后变量MY_ENV:$ENV{MY_ENV}")# 追加到环境变量set(ENV{PATH}"$ENV{PATH}:/new/path")# 常见环境变量message(STATUS"PATH:$ENV{PATH}")message(STATUS"USERPROFILE:$ENV{USERPROFILE}")message(STATUS"TEMP:$ENV{TEMP}")message(STATUS"JAVA_HOME:$ENV{JAVA_HOME}")message(STATUS"CMAKE_HOME:$ENV{CMAKE_HOME}")message(STATUS"USER_HOME:$ENV{USER_HOME}")4、父作用域
set(PARENT_VAR"父级变量")function(my_func)# 函数内部的局部变量set(LOCAL_VAR"函数内局部变量")message("函数内: LOCAL_VAR =${LOCAL_VAR}")message("函数内: PARENT_VAR =${PARENT_VAR}")# 修改父作用域的变量set(PARENT_VAR"父级变量-函数内修改后"PARENT_SCOPE)# 在父作用域创建新变量set(NEW_VAR"函数内创建父级变量"PARENT_SCOPE)endfunction()# 调用函数my_func()message("函数外: PARENT_VAR =${PARENT_VAR}")message("函数外: LOCAL_VAR =${LOCAL_VAR}")message("函数外: NEW_VAR =${NEW_VAR}")