CMake变量赋值
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>)
bash
# ── 普通变量 ──────────────────────────────────
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 "版本") |
bash
# ── CACHE 变量(可被 -D 命令行覆盖)──────────
# CACHE, STRING变量
set(MY_PORT 8080 CACHE 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" CACHE PATH "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_PORT 7070 CACHE STRING "服务端口号" FORCE)
message(STATUS "强制覆盖MY_PORT: ${MY_PORT}")
unset(MY_PORT CACHE)
3、ENV变量
bash
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、父作用域
bash
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}")