cmake进阶:宏定义

一.  简介

前面学习了 CMakeLists.txt语法中是如何定义函数,本文继续学习 cmake中的宏定义。

二.  cmake进阶:宏定义

cmake 提供了定义宏的方法,cmake 函数 function 宏定义 macro 在某种程度上来说是一样的,都是创建一段有名字的代码可以在后面被调用,还可以传参数。

通过 macro()命令定义宏,如下所示:

macro(<name> [arg1 [arg2 [arg3 ...]]])
  COMMAND1(ARGS ...)
  COMMAND2(ARGS ...)
 ...
endmacro(<name>)

endmacro 括号中的 <name> 可写可不写,如果写了,就必须和 macro 括号中的<name>一致。
参数 name 表示宏定义的名字。
在宏定义中也可以使用前面给大家介绍的 ARGVX(X 是一个数字)、ARGCARGVARGN 这些变量所以这些也是宏定义的内部变量。
在 顶层 CMakeLists.txt 文件中添加如下代码
# macro 宏定义测试
macro(XYZ arg1 arg2)
 message("ARGC: ${ARGC}")
 message("ARGV: ${ARGV}")
 message("ARGN: ${ARGN}")
 message("ARGV0: ${ARGV0}")
 message("ARGV1: ${ARGV1}")

 # 循环打印出各个参数
 set(i 0)
 foreach(loop ${ARGV})
     message("arg${i}: " ${loop})
     math(EXPR i "${i} + 1")
 endforeach()
endmacro()

# 使用宏
XYZ(A B C D E)

进入 build目录下,执行"cmake .."命令后打印信息如下:

从定义上看他们貌似一模一样,宏和函数确实差不多,但还是有区别的。

譬如,宏的参数和诸如 ARGV、ARGCARGN 之类的值不是通常 CMake 意义上的变量,它们是字符串替换,就像 C 语言预处理器对宏所做的一样,因此,您将无法使用以下命令:
if(ARGV1) # ARGV1 is not a variable
if(DEFINED ARGV2) # ARGV2 is not a variable
if(ARGC GREATER 2) # ARGC is not a variable
foreach(loop_var IN LISTS ARGN) # ARGN is not a variable
因为在宏定义中,宏的参数和诸如 ARGC ARGV ARGN 等这些值并不是变量,它们是字符串替换。
也就是说,当 cmake 执行宏定义时,会先将宏的参数和 ARGC ARGV ARGN 等这些值进行字符串替换, 然后再去执行这段宏,其实就像是 C 语言中的预处理步骤,这是与函数不同的地方。
我们来进行测试:
# macro 宏
macro(abc arg1 arg2)
 if(DEFINED ARGC)
 message(true)
 else()
 message(false)
 endif()
endmacro()

# function 函数
function(xyz arg1 arg2)
 if(DEFINED ARGC)
 message(true)
 else()
 message(false)
 endif()
endfunction()

# 调用宏
abc(A B C D)
# 调用函数
xyz(A B C D)

上面的代码中,我们定义了一个宏 abc 和一个函数 xyz ,它们俩的代码是一样的,都是在内部使用 if() 判断 ARGC 是不是一个变量,如果是打印 true ,如果不是打印 false
下面会分别调用宏 abc 和函数 xyz ,打 印信息如下所示:

从打印信息可知,在宏定义中, ARGC 确实不是变量,其实在执行宏之前,会将 ARGC 进行替换,如下所示:
if(DEFINED 4)
message(true)
else()
message(false)
endif()
ARGC 替换为 4 (因为我们实际传入了 4 个参数)。
当然,除此之外,cmake 中函数和宏定义还有其它的区别,譬如函数有自己的作用域、而宏定义是没有作用域的概念。

关于 cmake的宏定义暂时学习到这里。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CMake 是一种用于自动生成构建脚本的工具,可以帮助开发者简化构建过程。当使用 CMake 时,有时会出现 "cmake_c_compiler not set, after enablelanguage" 的错误信息。 这个错误通常是由于没有正确设置 C 编译器引起的。CMake 在构建过程中需要根据项目的语言要求来选择合适的编译器,如果没有设置编译器,就会出现这个错误。 解决这个问题的方法是通过设置正确的编译器路径来修复。可以通过在 CMakeLists.txt 文件中添加如下代码来指定编译器路径: ``` set(CMAKE_C_COMPILER gcc) # 设置 C 编译器路径为 gcc ``` 在上述代码中,使用了 gcc 作为示例,实际上应该根据你的环境和需求来设置合适的编译器路径。 另外,如果你需要使用其他语言(例如 C++),也可以通过类似的方式设置对应的编译器。比如,对于 C++ 的设置可使用以下代码: ``` set(CMAKE_CXX_COMPILER g++) # 设置 C++ 编译器路径为 g++ ``` 完成以上设置后,重新运行 CMake,在编译过程中就不会再出现 "cmake_c_compiler not set, after enablelanguage" 的错误信息了。 总之,"cmake_c_compiler not set, after enablelanguage" 错误是由于没有正确设置 C 编译器引起的,通过设置正确的编译器路径,可以解决这个问题。 ### 回答2: cmake是一个跨平台的开源构建工具,它能够协助程序开发者自动进行软件构建的工作。当使用cmake构建项目时,如果在CMakeLists.txt文件中出现以下错误信息: "cmake error: cmake_c_compiler not set, after enablelanguage cmake error: cma" 这个错误意味着在CMakeLists.txt文件中启用了C语言支持(通过enable_language(C)命令),但是没有指定C编译器。 解决这个错误的方法是在CMakeLists.txt文件中明确指定C编译器。可以使用set命令来设置C编译器,例如: set(CMAKE_C_COMPILER gcc) 在上面的例子中,我们明确指定了C编译器为gcc。你可以根据你的项目需求和系统环境选择合适的C编译器。 当然,如果你没有特别要求使用某个特定的C编译器,你也可以忽略这个错误。CMake会尝试自动选择一个默认的C编译器来构建你的项目。 总之,通过在CMakeLists.txt文件中明确指定C编译器,你可以解决"cmake error: cmake_c_compiler not set, after enablelanguage cmake error: cma"这个错误。希望这个回答能对你有所帮助。 ### 回答3: cmake error: cmake_c_compiler not set, after enablelanguage cmake error: cma 说明在使用CMake时出现了一些问题。 这个错误发生在我们在CMakeLists.txt文件中启用了某个语言(比如C语言),但在设置编译器时出现了问题。 解决这个问题的方法是在CMakeLists.txt文件中正确设置C编译器。我们可以通过在文件的开头添加以下代码来设置编译器: ``` cmake_minimum_required(VERSION 3.0) # 假设我们使用的是CMake 3.0版本或更高版本 project(MyProject) enable_language(C) # 启用C语言支持 set(CMAKE_C_COMPILER gcc) # 设置C编译器为gcc(这里以gcc为例) # ... ``` 在这个例子中,我们使用了gcc作为C编译器,你可以根据你的需要修改为适合你的编译器。你也可以使用`-DCMAKE_C_COMPILER`选项在命令行中传递编译器的路径。 当我们正确设置了C编译器后,就可以使用`cmake`命令重新生成Makefile并进行编译了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值