跳到主要内容

CMake 函数和宏

CMake 支持用 function()macro() 封装重复逻辑,区别在于作用域:函数有独立作用域,宏是内联展开、使用调用处的作用域。

function(函数)

function(函数名 参数1 参数2 ...)
# 参数可通过 ARGV、ARGN 访问,也可用形参名
# 变量在函数内 set() 不会影响外部,除非 set(... PARENT_SCOPE)
endfunction()
  • ARGV:所有传入参数列表;
  • ARGN:超出形参个数的多余参数。
  • 在函数内 set(var value) 只改变函数内变量;若要让父作用域可见,需 set(var value PARENT_SCOPE)

macro(宏)

macro(宏名 参数1 参数2 ...)
# 宏体在调用处展开,使用调用处的变量作用域
endmacro()
  • 宏没有独立作用域,其中 set() 会修改调用处的变量。
  • 适合简单替换、重复一段“模板”式 CMake 代码。

何时用函数、何时用宏

  • 希望“封装一段逻辑且不污染外部变量”时用 function
  • 希望“像写内联代码一样,直接读写当前变量”时用 macro;注意避免变量名冲突。

小结

  • function:独立作用域,通过 PARENT_SCOPE 向父作用域传值。
  • macro:无独立作用域,在调用处展开。

CMake 自身大量使用“命令”形式,其实现也常为函数或宏;自定义时优先用 function 更安全。

阿基米东
📝 作者:阿基米东

GetIoT.tech 创始人,独立开发者,Linux 重度用户,开源软件作者,创业者,INTJ