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 .. 这会列出所有的缓存变量及其值。
阅读全文