CMake变量赋值

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}")