CMAKE学习笔记中,有哪些技巧和用法?
摘要:CMAKE学习笔记【Part1】 (零) 变量 一、基本概念 CMake 中的变量是 字符串类型(或列表),没有内置的数据结构如数组、字典等。变量的作用类似于 shell 脚本中的环境变量,但也有自己的作用域机制。 常见预定义变量(举例)
CMAKE学习笔记【Part1】
(零) 变量
一、基本概念
CMake 中的变量是 字符串类型(或列表),没有内置的数据结构如数组、字典等。变量的作用类似于 shell 脚本中的环境变量,但也有自己的作用域机制。
常见预定义变量(举例)
PROJECT_NAME:当前项目的名称。
CMAKE_CURRENT_SOURCE_DIR:当前处理的源码目录。
CMAKE_CURRENT_BINARY_DIR:当前构建的二进制目录。
CMAKE_SOURCE_DIR:项目根目录。
CMAKE_BINARY_DIR:构建输出根目录。
CMAKE_CXX_COMPILER:C++ 编译器路径。
CMAKE_BUILD_TYPE:构建类型(Debug/Release)。
二、变量的设置
1. 使用 set() 设置变量
set(VAR_NAME value [CACHE TYPE DOCSTRING [FORCE]])
示例:
set(MY_VAR "Hello CMake")
message(STATUS "MY_VAR = ${MY_VAR}")
输出:
-- MY_VAR = Hello CMake
设置多个值(列表)
set(MY_LIST a b c)
message(STATUS "MY_LIST = ${MY_LIST}")
输出:
-- MY_LIST = a;b;c
如果你希望用空格分隔显示为字符串:
message(STATUS "MY_LIST = ${MY_LIST}")
# 或者转换为空格分隔
message(STATUS "MY_LIST = ${MY_LIST}")
2. 使用 option() 设置布尔变量
用于用户可配置的开关选项,默认值为 ON 或 OFF。
option(USE_MYMATH "Use custom math library" ON)
你可以像普通变量一样使用它:
if(USE_MYMATH)
message(STATUS "Using custom math")
else()
message(STATUS "Not using custom math")
endif()
3. 使用 unset() 删除变量
unset(MY_VAR)
可用于清除某些变量的影响。
三、变量的引用
使用 ${VAR_NAME} 来引用变量值。
set(NAME "Alice")
message(STATUS "Hello, ${NAME}!")
输出:
-- Hello, Alice!
如果变量未定义,则会被替换为空字符串。
四、变量的作用域(Scope)
CMake 的变量作用域不像 C/C++ 那样严格,但它有以下几种行为:
1. 局部作用域(Local Scope)
默认情况下,set() 设置的变量只在当前 CMakeLists.txt 文件中有效,不会传递到父级或子级目录。
# CMakeLists.txt
set(MY_VAR "local")
add_subdirectory(subdir) # 进入 subdir 目录
# subdir/CMakeLists.txt
message(STATUS "MY_VAR = ${MY_VAR}") # 输出空,因为不在同一个作用域
2. PARENT_SCOPE
如果你想把一个变量设置回上一级作用域(比如你在 add_subdirectory() 内部设置变量返回给上级),可以使用:
# subdir/CMakeLists.txt
set(MY_VAR "from child" PARENT_SCOPE)
这样上级就能看到这个值了。
3. CACHE 变量(全局可见)
使用 set(... CACHE ...) 定义的变量是全局的,保存在 CMake 缓存中,可以在任何地方访问。
set(MY_CACHE_VAR "global value" CACHE STRING "Description of this variable")
这种变量通常用于跨目录通信或配置持久化(例如用户通过 -DMY_VAR=value 传参)。
你也可以使用 cache 类型来覆盖缓存值:
cmake .. -DMY_CACHE_VAR="new value"
五、常见问题与技巧
1. 如何查看所有变量?
你可以运行:
cmake --build . --target help
或者更直接地:
cmake -LAH ..
这会列出所有的缓存变量及其值。
