一. 简介
前一篇文章学习 cmake中的定义函数基本用法,函数的内部变量。文章如下:
本文继续学习 cmake中的定义函数,主要学习函数作用域。
二. cmake进阶:函数的作用域
在 cmake 中,通过 function() 命令定义的函数类似于一个自定义命令(实际上并不是)。
事实上,cmake 提供了自定义命令的方式,譬如,通过 add_custom_command() 来实现,如果大家有兴趣,可以自己去学习下。
使用 function() 定义的函数,我们需要对它的使用范围进行一个简单地了解。譬如有如下工程目录结构:
我们在顶层目录下定义了一个函数 xyz ,顶层 CMakeLists.txt 源码内容如下:
# CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO VERSION 1.1.0)
# 函数名: xyz
function(xyz)
message("Hello World!")
endfunction()
# 加载子源码
add_subdirectory(hello)
接着我们在子源码中调用 xyz() 函数, hello 目录下的 CMakeLists.txt 如下所示:
# hello 目录下的 CMakeLists.txt
message("这是子源码")
xyz() # 调用 xyz()函数
大家觉得这样子可以调用成功吗? 事实上,这是没问题的。
父源码中定义的函数、在子源码中是可以调用的。进入 build目录下,执行"cmake .."命令后打印信息如下:
那反过来,子源码中定义的函数,在父源码中可以使用吗?我们来进行测试,顶层 CMakeLists.txt 源码 内容如下:
# CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO VERSION 1.1.0) #设置工程版本号为 1.1.0
# 加载子源码
add_subdirectory(hello)
message("这是父源码")
xyz()
在父源码中调用
xyz()
函数,在子源码中定义
xyz()
函数,如下所示:
message("这是子源码")
# 函数名: xyz
function(xyz)
message("Hello World!")
endfunction()
进入到
build
目录执行
cmake
,如下所示:
事实证明,这样也是可以的。
说明通过
function()定义的函数它的使用范围是全局的,并不局限于当前源码、可以在其子源码或者父源码中被使用。