news 2026/4/23 1:55:20

CMake基础:foreach详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CMake基础:foreach详解

目录

1.简介

2.使用场景

2.1.批量添加源文件到目标

2.2.遍历目录下的所有指定文件

2.3.批量链接第三方库

3.循环控制(CMake 3.20+ 支持)

4.同时循环多个列表

5.注意事项


1.简介

CMake 的foreach是遍历列表 / 集合的核心指令,支持传统遍历现代关键字遍历两种语法,常用于批量处理源文件、库依赖、编译选项等场景。

语法:

foreach(<循环变量> IN [LISTS <列表名>] [ITEMS <元素>] [RANGE <起始> <结束>]) # 循环体 endforeach()
  • LISTS:遍历已定义的 CMake 列表变量
  • ITEMS:遍历直接给出的元素
  • RANGE:遍历数值范围(如RANGE 1 5对应 1-5)

2.使用场景

2.1.批量添加源文件到目标

适用于项目源文件较多的情况,避免重复写add_executable的参数。

cmake_minimum_required(VERSION 3.15) project(ForeachDemo LANGUAGES CXX) # 定义源文件列表 set(SOURCE_FILES main.cpp utils.cpp network.cpp ) # 遍历源文件列表,打印并收集(这里直接用列表也能加,遍历主要用于额外操作) foreach(src IN LISTS SOURCE_FILES) message(STATUS "添加源文件: ${src}") endforeach() # 添加可执行文件 add_executable(${PROJECT_NAME} ${SOURCE_FILES}) # Windows + VS2019 环境配置 if(MSVC) target_compile_options(${PROJECT_NAME} PRIVATE /W4 /WX) endif()

2.2.遍历目录下的所有指定文件

结合file(GLOB)收集目录中的.cpp文件,适合动态管理源文件。

cmake_minimum_required(VERSION 3.15) project(ForeachFileDemo LANGUAGES CXX) # 收集 src 目录下的所有 .cpp 文件(GLOB 会自动生成列表) file(GLOB_RECURSE SRC_FILES ${CMAKE_SOURCE_DIR}/src/*.cpp) # 遍历文件列表,过滤掉不需要的文件(比如 test_xxx.cpp) foreach(file IN LISTS SRC_FILES) # 检查文件名是否包含 test_ if(file MATCHES "test_.*\\.cpp$") message(STATUS "过滤测试文件: ${file}") list(REMOVE_ITEM SRC_FILES ${file}) # 从列表中移除 endif() endforeach() add_executable(${PROJECT_NAME} ${SRC_FILES})

注意:file(GLOB)不推荐用于频繁增减文件的场景,若文件变动需手动执行cmake --build . --clean-first重新生成。

2.3.批量链接第三方库

适用于项目依赖多个库的情况,简化target_link_libraries的写法。

cmake_minimum_required(VERSION 3.15) project(ForeachLibDemo LANGUAGES CXX) add_executable(${PROJECT_NAME} main.cpp) # 定义依赖库列表(假设已通过 find_package 找到这些库) set(DEPEND_LIBS Qt5::Core Qt5::Sql Boost::asio ) # 遍历库列表,批量链接 foreach(lib IN LISTS DEPEND_LIBS) target_link_libraries(${PROJECT_NAME} PRIVATE ${lib}) message(STATUS "链接库: ${lib}") endforeach()

3.循环控制(CMake 3.20+ 支持)

CMake 3.20 及以上版本支持continue()(跳过当前循环)和break()(终止循环),示例如下:

foreach(num RANGE 1 10) if(num LESS 3) continue() # 跳过 1、2 endif() if(num GREATER 7) break() # 终止于 8 endif() message(STATUS "当前数值: ${num}") endforeach()

4.同时循环多个列表

CMake 的foreach本身不支持直接并行遍历多个列表,需借助索引循环 + 列表取值实现,核心思路是通过列表长度确定循环次数,再用list(GET)获取对应索引的元素。

示例:同时遍历源文件列表对应的编译选项列表,为不同源文件设置专属编译参数

cmake_minimum_required(VERSION 3.15) project(MultiListForeach LANGUAGES CXX) # 定义两个长度相同的列表 set(SOURCE_FILES main.cpp utils.cpp network.cpp) set(COMPILE_FLAGS "-O2" "-g -Wall" "-O3 -march=native") # 获取列表长度(需确保所有列表长度一致) list(LENGTH SOURCE_FILES FILE_COUNT) if(NOT FILE_COUNT EQUAL ${CMAKE_ARGV2}) message(FATAL_ERROR "列表长度不一致,无法并行遍历!") endif() # 索引循环,遍历多个列表 math(EXPR MAX_INDEX "${FILE_COUNT} - 1") foreach(IDX RANGE 0 ${MAX_INDEX}) # 获取对应索引的元素 list(GET SOURCE_FILES ${IDX} CURRENT_FILE) list(GET COMPILE_FLAGS ${IDX} CURRENT_FLAG) # 打印信息 + 应用编译选项 message(STATUS "为 ${CURRENT_FILE} 设置编译选项: ${CURRENT_FLAG}") set_source_files_properties(${CURRENT_FILE} PROPERTIES COMPILE_FLAGS ${CURRENT_FLAG}) endforeach() add_executable(${PROJECT_NAME} ${SOURCE_FILES}) # Windows VS2019 环境适配 if(MSVC) target_compile_options(${PROJECT_NAME} PRIVATE /W4) endif()

5.注意事项

1.循环变量的作用域:foreach内定义的变量默认是全局的,若需局部作用域,可在循环内用set(<var> <value> PARENT_SCOPE)控制。

2.跨平台路径处理:遍历文件路径时,建议用CMAKE_SOURCE_DIR/CMAKE_CURRENT_SOURCE_DIR等变量,避免硬编码 Windows 路径分隔符。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 6:15:01

30天掌握Whisky:macOS完美运行Windows程序的系统化方案

30天掌握Whisky&#xff1a;macOS完美运行Windows程序的系统化方案 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 在当今跨平台需求日益增长的背景下&#xff0c;macOS用户经常面临…

作者头像 李华
网站建设 2026/4/21 1:27:11

BGE-Reranker-v2-m3文档预处理:输入格式标准化指南

BGE-Reranker-v2-m3文档预处理&#xff1a;输入格式标准化指南 1. 技术背景与核心价值 在当前的检索增强生成&#xff08;RAG&#xff09;系统中&#xff0c;向量数据库通过语义相似度进行初步文档召回&#xff0c;但其基于嵌入距离的匹配机制存在明显的局限性。例如&#xf…

作者头像 李华
网站建设 2026/4/12 8:58:42

中文NLP避坑指南:用bert-base-chinese镜像解决常见部署问题

中文NLP避坑指南&#xff1a;用bert-base-chinese镜像解决常见部署问题 1. 引言&#xff1a;中文NLP落地的现实挑战 在自然语言处理&#xff08;NLP&#xff09;的实际工程中&#xff0c;模型部署阶段的问题往往比训练本身更棘手。尤其是在中文场景下&#xff0c;使用如 bert…

作者头像 李华
网站建设 2026/4/22 20:17:36

通义千问2.5-7B-Instruct部署优化:内存管理最佳实践

通义千问2.5-7B-Instruct部署优化&#xff1a;内存管理最佳实践 1. 引言 随着大语言模型在实际业务场景中的广泛应用&#xff0c;如何高效部署并优化资源使用成为工程落地的关键挑战。Qwen2.5-7B-Instruct 作为通义千问系列中性能强劲的指令调优模型&#xff0c;在对话理解、…

作者头像 李华
网站建设 2026/4/21 11:53:03

RemixIcon图标配色终极指南:从零开始打造个性化主题

RemixIcon图标配色终极指南&#xff1a;从零开始打造个性化主题 【免费下载链接】RemixIcon Open source neutral style icon system 项目地址: https://gitcode.com/gh_mirrors/re/RemixIcon 还在为网页中的图标颜色单调而烦恼吗&#xff1f;想要快速为项目添加专业级的…

作者头像 李华
网站建设 2026/4/22 19:46:42

从0开始学UI-TARS-desktop:多模态AI助手入门到实战

从0开始学UI-TARS-desktop&#xff1a;多模态AI助手入门到实战 你是否希望用自然语言控制电脑完成复杂任务&#xff1f;是否厌倦了重复性的界面操作和手动流程&#xff1f;本文将带你从零开始掌握 UI-TARS-desktop ——一款基于视觉语言模型&#xff08;VLM&#xff09;的轻量…

作者头像 李华