CMake中遍历元素的技巧:foreach命令详解

简介: CMake中遍历元素的技巧:foreach命令详解

Cmake 中用于遍历的命令

  • foreach:用于遍历一个列表,并对其中的每个元素执行一组命令。
  • list:通过下标遍历列表中的元素。
  • file:可以进行文件系统的基本操作,还可以遍历目录树并获取文件信息,例如获取文件名、文件路径、文件大小、修改时间等。

Cmake中的循环语句

Cmake是一种用于自动化构建和编译的工具,它可以根据您编写的脚本自动生成Makefile或Visual Studio项目文件。而循环语句则是Cmake中的一个非常重要的功能,用于在构建过程中遍历列表和目录,做到自动化和批量化操作。

为什么需要循环语句

因为在实际项目中,有时需要对一个列表或者目录下的所有文件进行相同的处理,例如编译、链接、测试、安装等等。这时,手动逐个处理是非常麻烦和浪费时间的,而使用循环语句则可以大大提高效率。

Cmake中的循环语句概述

在Cmake中,循环语句主要用foreach命令实现也是本文重点介绍的内容。foreach命令的格式为:

foreach(<loop_variable> <item1> [<item2> ...])
    # Commands to execute
endforeach()

其中,是循环变量,它会依次遍历列表中的每一个元素,而和是列表中的元素。在循环语句内部,可以执行各种命令,例如设置变量、执行命令等等。当遍历完所有元素后,循环就会结束。

需要注意的是,Cmake中的循环语句与其他编程语言中的循环语句略有不同,因为Cmake的脚本是用来生成Makefile或项目文件的,而不是直接执行代码。因此,循环语句中的命令实际上是用来生成构建指令的,而不是执行真正的代码。 总之,循环语句是Cmake中非常重要的一个功能,它可以用于遍历列表、目录等等,实现自动化构建和批量化操作。在下一节中,我们将更进一步地介绍Cmake中的foreach命令,帮助您理解如何使用循环语句。


foreach 命令

列表是Cmake中一个非常重要的概念,它可以是一组值,也可以是一个文件、一个目录等等。在使用foreach命令时,我们需要先定义一个列表,例如:

set(LIST_VAR item1 item2 item3 ...)

其中,LIST_VAR是一个自定义的变量名,item1、item2、item3等等是列表中的元素,它们之间用空格隔开。有了列表之后,就可以使用foreach命令来遍历它了。

foreach命令的语法

foreach(<loop_variable> <item1> [<item2> ...])
   # Commands to execute
 endforeach()

其中,是循环变量,它会依次遍历列表中的每一个元素,而和是列表中的元素。在循环语句内部,可以执行各种命令,例如设置变量、执行命令等等。当遍历完所有元素后,循环就会结束。

示例代码

下面是一个示例代码,展示了如何使用foreach命令遍历列表并打印出每个元素:

set(LIST_VAR item1 item2 item3)
foreach(ITEM ${LIST_VAR})
   message(${ITEM})
endforeach()

在上面的代码中,我们先定义了一个名为LIST_VAR的列表,并将其赋值为item1、item2、item3。然后,使用foreach命令遍历这个列表,将每个元素赋值给变量ITEM,并打印出来。

需要注意的是,循环语句中的命令实际上是用来生成构建指令的,而不是执行真正的代码。因此,在使用循环语句时,需要遵循Cmake语言的一些基础规则,例如使用双引号而非单引号来表示字符串,使用变量时要加上${}等等。

总之,foreach命令是Cmake中一个非常重要的工具,它可以用于遍历列表、目录等等,实现自动化构建和批量化操作。需要注意的是,列表结构必须符合Cmake的规范,并遵循基础语言规则。

foreach 命令的高级用法

foreach 命令还有一些高级用法,可以更灵活地遍历和操作列表变量中的元素。例如:

使用 ${my_list} 语法遍历列表变量,可以在循环体中使用 BREAK 和 CONTINUE 控制循环流程:

foreach(item ${my_list})
   if(item STREQUAL "bar")
       continue()
   endif()
   if(item STREQUAL "baz")
       break()
   endif()
   message("${item}")
endforeach()

在这个例子中,我们使用 ${my_list} 语法遍历 my_list 列表中的元素。如果元素的值等于 bar,则跳过此次循环;如果元素的值等于 baz,则终止循环。否则,输出元素的值。

  • 使用 foreach 命令的 RANGE 模式遍历数字序列
foreach(i RANGE 1 10)
   message("${i}")
endforeach()

在这个例子中,我们使用 RANGE 模式遍历数字序列 1 到 10,依次输出每个数字。

使用 foreach 命令的 IN LISTS 模式遍历多个列表变量:

set(my_list1 foo bar)
set(my_list2 baz qux)
foreach(item1 IN LISTS my_list1 item2 IN LISTS my_list2)
   message("${item1} ${item2}")
endforeach()

在这个例子中,我们使用 IN LISTS 模式遍历两个列表变量 my_list1 和 my_list2。每次循环从两个列表中取出一个元素,依次输出每组元素的值。


while命令

CMake 中 while 命令的原型为:

while(condition)
    # commands endwhile() 

while 命令用于执行指定条件下的一系列命令,直到条件不再满足为止。condition

可以是一个表达式、一个变量或一个函数,只要返回值为非空字符串即为真。while 命令可以用于循环遍历列表、处理文件等场景。

使用 while 命令时,需要注意以下几点:

condition 的值必须在循环内部进行更新,否则可能导致死循环。 while 命令只能在函数或宏定义中使用,不能在全局作用域中使用。

在循环内部,可以使用 break 命令跳出循环,或使用 continue 命令跳过当前迭代。 while 命令在 CMake

中的应用场景较多,例如在编译时动态生成代码、处理配置文件、自动生成代码列表等。

list 命令

CMake中的list命令主要用于操作列表变量,例如向列表中添加、删除元素,获取列表中的元素个数等,它本身并不用于遍历列表。

list 命令可以用于获取和修改列表变量中的元素。例如:

set(my_list foo bar baz)
list(GET my_list 1 second_element)
message("${second_element}")

在这个例子中,list(GET my_list 1 second_element) 命令获取 my_list 列表中的第二个元素,并将其存储到 second_element 变量中。然后我们使用 message 命令输出 second_element 变量的值。

list 命令还可以用于获取列表的长度、删除元素、插入元素等操作。具体用法可参考 CMake 官方文档。


file 命令

file 命令支持的操作比较多,可以读写、创建或复制文件和目录、计算文件 hash、下载文件、压缩文件等等。使用的语法都比较类似,以递归遍历文件为例,下面是获取 src 目录下两个子目录内所有 c 文件的列表的示例:file (GLOB_RECURSE ALL_SRC src/module1/.c src/module2/.c )。GLOB_RECURSE 表示执行递归查找,查找目录下所有符合指定正则表达式的文件。


分隔符

什么是分隔符?

在编程中,分隔符是一种用于分隔多个元素的符号或字符,通常用于表示列> > 表、数组、参数等。在 CMake 中,分号是一种常用的分隔符,用于分隔列表变量> 中的多个元素。

CMake 中的默认分隔符

在 CMake 中,默认的分隔符是分号(;)。当你定义一个列表变量时,可以使用分号将多个元素分隔开。例如:

set(my_list foo bar baz)

在这个例子中,my_list 变量是一个包含三个元素的列表,每个元素之间使用分号分隔。

如何在 CMake 中使用分隔符

定义列表变量

在 CMake 中,你可以使用分号将多个元素分隔开,定义一个列表变量。例如:

set(my_list foo;bar;baz)

在这个例子中,my_list 变量是一个包含三个元素的列表,每个元素之间使用分号分隔。

遍历列表变量

你可以使用 foreach 命令遍历列表变量中的元素,并对每个元素执行某些操作。例如:

foreach(item ${my_list})
    message("${item}")
endforeach()

在这个例子中,foreach 命令会逐个遍历 my_list 列表中的元素,将每个元素赋值给 itemmessageitem变量,并执行message命令输出{item} 变量,并执行 message 命令输出 {item} 变量的值。

自定义分隔符

如果你想使用其他的分隔符,可以使用 separate_arguments 命令将字符串转换为列表,并指定分隔符。例如:

set(my_string "foo|bar|baz")
separate_arguments(my_list "|" ${my_string})
foreach(item ${my_list})
    message("${item}")
endforeach()

在这个例子中,我们使用 separate_arguments 命令将 my_string 字符串按照 | 分隔符转换为列表,并将结果存储到 my_list 变量中。然后我们使用 foreach 命令遍历 my_list 变量中的元素,并打印出每个元素。


总结

当我们使用Cmake来构建项目时,经常需要遍历一些元素,如列表或目录。循环遍历的能力是Cmake的一个核心功能,也是一个非常重要的工具。使用循环语句,我们可以方便地自动化构建和编译过程,以及在各种环境中进行测试。

在本文中,我们介绍了Cmake中的foreach循环语句,它是一个强大而灵活的工具,可以用来遍历列表和目录。我们详细讲解了foreach命令的语法和用法,并提供了示例代码来帮助您理解如何使用它。

在使用foreach命令时,有几个要点需要注意。首先,列表和目录的结构必须符合Cmake的规范;其次,您需要了解一些有关Cmake语言的基础知识;最后,您可以根据实际需要定制循环来满足您的需求。

总之,循环遍历是Cmake中的一个非常重要的功能,可以大大提高我们的开发效率和构建速度。我们鼓励您深入了解这个功能并在您的项目中尝试应用它。


目录
相关文章
|
7月前
|
缓存 测试技术 编译器
【CMake 疑难解决 】解决find_library查找位置不对的问题
【CMake 疑难解决 】解决find_library查找位置不对的问题
459 3
|
4月前
|
Unix Shell Linux
如何使用find查找命令
如何使用find查找命令
|
Python
python之列表中常用的函数:append,extend,insert,pop,remove,del函数的定义与使用方法,元素是否在列表中的判断
python之列表中常用的函数:append,extend,insert,pop,remove,del函数的定义与使用方法,元素是否在列表中的判断
146 0
|
JavaScript 索引
vue 数组处理= 循环--查找过滤--添加删除--去重[.every()/.some()/.find()/.filter()/.forEach()/.map()]
vue 数组处理= 循环--查找过滤--添加删除--去重[.every()/.some()/.find()/.filter()/.forEach()/.map()]
342 0
vue 数组处理= 循环--查找过滤--添加删除--去重[.every()/.some()/.find()/.filter()/.forEach()/.map()]
|
存储 Java 程序员
foreach中不允许对元素进行add和remove底层原理
foreach中不允许对元素进行add和remove底层原理 🍅 Java学习路线:搬砖工的Java学习路线 🍅 作者微信公众号:程序员小王 🍅 程序员小王的博客:https://www.wolai.com/wnaghengjie/ahNwvAUPG2Hb1Sy7Z8waaF 🍅 扫描主页左侧二维码,加我微信 一起学习、一起进步 🍅 欢迎点赞 👍 收藏 ⭐留言 📝
130 0
foreach中不允许对元素进行add和remove底层原理
LeetCode-27. 移除元素(Goland实现)
LeetCode-27. 移除元素(Goland实现)
107 0
|
安全 Shell