CMake入门教程【核心篇】变量的作用域

发布时间:2024年01月03日

在这里插入图片描述

😈「CSDN主页」传送门
😈「Bilibil首页」传送门
😈「本文的内容」:CMake入门教程
😈「动动你的小手」点赞👍收藏??评论📝


在CMake中理解变量的作用域对于编写有效和可维护的CMake脚本至关重要。本教程将深入探讨CMake中变量的作用域及其使用。

CMake变量作用域
普通变量
缓存变量
变量覆盖
函数和宏作用域
传递变量
推荐做法
局部于定义目录和子目录
项目范围内全局可见
子目录更改不影响父目录
仅在函数或宏内有效
通过函数参数传递
使用局部变量和明确的缓存变量

1. CMake变量的类型

CMake主要处理两种类型的变量:

  • 普通变量:在CMake脚本执行期间设置和访问。
  • 缓存变量:长期存在,即使在CMake配置结束后也会被保存。

2. 变量的作用域

在CMake中,变量的作用域是由其定义的上下文决定的:

2.1 普通变量

普通变量的作用域通常局限于其被定义的目录和子目录。当在CMakeLists.txt文件或包含的文件(通过include命令)中设置变量时,这些变量仅在当前处理的CMake目录及其子目录中可见。

cmakeCopy code
set(MY_VAR "Hello") # 在当前目录和子目录中可见

2.2 缓存变量

缓存变量在整个项目范围内可见,可以跨多次CMake配置运行保持其值。通过set()命令并使用CACHE选项创建缓存变量:

cmakeCopy code
set(MY_CACHE_VAR "World" CACHE STRING "A cache variable")

3. 变量覆盖

在子目录中对变量进行修改不会影响父目录中的同名变量。每个目录可以有自己的变量版本,子目录中的变量更改仅在该子目录及其子目录中有效。

4. 函数和宏的作用域

在函数或宏内部设置的变量仅在该函数或宏的作用域内有效。调用函数或宏时,它们无法修改父作用域中的变量,除非使用PARENT_SCOPE选项。

function(my_function)
    set(MY_VAR "Local" PARENT_SCOPE)
endfunction()

5. 传递变量

可以通过函数参数将变量从一个作用域传递到另一个作用域。

function(print_var VAR)
    message("${VAR}")
endfunction()

set(MY_VAR "Hello World")
print_var(${MY_VAR})

6. 推荐做法

为了避免混淆和潜在的错误,建议:

  • 在可能的情况下使用局部变量。
  • 明确指定和使用缓存变量。
  • 尽量避免在子目录或函数内部更改父作用域的变量。

理解并正确使用变量的作用域有助于提高CMake脚本的可读性和可维护性。通过遵循这些指导原则,您可以确保CMake项目的配置逻辑清晰且易于管理。

文章来源:https://blog.csdn.net/hiwoshixiaoyu/article/details/135073511
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。