news 2026/2/14 20:32:20

cmake_file(GLOB)详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
cmake_file(GLOB)详解

文章目录

  • 第二章 CMake基础语法
    • 2.9 file()
      • 2.9.1 file子命令
      • 2.9.2 GLOB/GLOB_RECURSE子命令的使用
      • 2.9.3 写文件 (WRITE / APPEND)
      • 2.9.4读文件 (READ / STRINGS)
      • 2.9.5 复制/重命名/删除(COPY/RENAME/REMOVE)
      • 2.9.6 file部分完整测试代码

本文介绍cmake的file()文件操作函数,该函数功能强大,可以读文件,写文件,复制,删除,重命名等操作。

第二章 CMake基础语法

2.9 file()

file() 是 CMake 中功能最强大的命令之一,用于执行各种文件系统操作(读写、搜索、复制等)。

2.9.1 file子命令

使用file(GLOB|GLOB RECURSE )命令匹配文件列表;
子命令:

GLOB I GLOB_RECURSE : 生成与匹配的文件列表。GLOB 不搜索子目录;GLOB_RECURSE 会递归搜索子目录; WRITE 写入内容到文件中 MAKE DIRECTORY 创建给定的目录及其父目录。 REMOVE 删除给定的文件 COPY_FILE 复制文件 RELATIVE_PATH 计算相对路径。

2.9.2 GLOB/GLOB_RECURSE子命令的使用

使用GLOB/GLOB_RECURSE 来代替aux_source_directory 搜索目录下的文件。aux_source_directory只是搜索指定目录下的源文件;而FILE(GLOB)可以通过通配符搜索目录下的所有文件。
GLOB: 搜索当前目录符合模式的文件。
GLOB_RECURSE: 递归搜索子目录。
语法格式如下:

file(GLOB<variable>[LIST_DIRECTORIEStrue|false][RELATIVE<path>][CONFIGURE_DEPENDS]<globbing-expressions>...)
参数说明:

参数1:: 存储搜索结果的变量名。
参数2:[LIST_DIRECTORIES true|false]:是否在结果列表中包含目录。默认为 true。如果只想获取文件,可以设置为 false。
参数3:[RELATIVE]: 让返回的文件路径相对于指定的,而不是绝对路径。${CMAKE_CURRENT_SOURCE_DIR} 作为相对基准。
参数4:[CONFIGURE_DEPENDS] (重要:CMake 3.12+):解决 GLOB 不会自动更新的问题。
如果加上这个参数,CMake 会在构建时检查目录内容。如果增加了新文件,构建系统会自动重新运行 CMake 来更新文件列表。
示例:

file(GLOB SOURCES CONFIGURE_DEPENDS"*.cpp")

[FOLLOW_SYMLINKS] (仅限 GLOB_RECURSE):
是否递归进入符号链接指向的目录。
参数5::匹配模式,可以写多个。
.cpp:匹配所有 C++ 源文件。
src/
.h:匹配 src 目录下所有头文件。
test?.cpp:匹配 test1.cpp, test2.cpp 等(? 匹配单个字符)。
代码文件结构:

cmake_minimum_required(VERSION3.30)project(testfile VERSION1.0LANGUAGES CXX)# GLOBfile(GLOB SOURCES"*.cpp")message("SOURCES =${SOURCES}")# SOURCES = E:/cmakeLearning/chap2/5file/main.cpp;# E:/cmakeLearning/chap2/5file/mycul.cpp# 可以看出,搜索到了两个.cpp文件。# GLOB_RECURSE# file(GLOB_RECURSE ALL_SOURCES RELATIVE "./build" "*.cpp")file(GLOB_RECURSE ALL_SOURCES RELATIVE${CMAKE_CURRENT_SOURCE_DIR}CONFIGURE_DEPENDS"*.cpp")message("ALL_SOURCES =${ALL_SOURCES}")#[[ALL_SOURCES=a/a.cpp;build/CMakeFiles/4.2.1/CompilerIdCXX/CMakeCXXCompilerId.cpp;main.cpp;mycul.cpp]]# 可以发现,递归搜索出了目录下面的所有.cpp文件add_executable(testfile${SOURCES})

2.9.3 写文件 (WRITE / APPEND)

WRITE: 写入内容(覆盖原文件)。
APPEND: 在末尾追加内容。

message("###############################")file(WRITE"version.txt""hello cmake")#追加file(APPEND"version.txt""\nhello APPEND")

WRITE测试结果:会在当前目录下面生成一个version.txt文件,并在该文件中插入 hello cmake字符串。
APPEND测试结果:会在version.txt文件中,添加 hello APPEND字符串,结果如下:

2.9.4读文件 (READ / STRINGS)

READ: 读取整个文件内容。
STRINGS: 按行读取,适合处理配置文件。
下面分别测试

# 读文件file(READ"version.txt"CONTENTS)message("CONTENTS =${CONTENTS}")#[[CONTENTS=hello cmake hello APPEND]]# 按行读file(STRINGS"version.txt"lines)message("line =${lines}")# line = hello cmake;hello APPEND

2.9.5 复制/重命名/删除(COPY/RENAME/REMOVE)

拷贝测试:拷贝一份version.txt 到指定的目录下。

# 拷贝一份file(COPY"version.txt"DESTINATION"${CMAKE_CURRENT_SOURCE_DIR}/a/version.txt")

重命名测试:

# 重命名:将 a/version.txt 重命名为 a/version2.txtfile(RENAME"${CMAKE_CURRENT_SOURCE_DIR}/a/version.txt""${CMAKE_CURRENT_SOURCE_DIR}/a/version2.txt")

输出文件测试:删除指定的文件

# 删除文件或目录file(REMOVE"${CMAKE_CURRENT_SOURCE_DIR}/a/version2.txt")

2.9.6 file部分完整测试代码

cmake_minimum_required(VERSION3.30)project(testfile VERSION1.0LANGUAGES CXX)# GLOBfile(GLOB SOURCES"*.cpp")message("SOURCES =${SOURCES}")# SOURCES = E:/cmakeLearning/chap2/5file/main.cpp;# E:/cmakeLearning/chap2/5file/mycul.cpp# 可以看出,搜索到了两个.cpp文件。# GLOB_RECURSE# file(GLOB_RECURSE ALL_SOURCES RELATIVE "./build" "*.cpp")file(GLOB_RECURSE ALL_SOURCES RELATIVE${CMAKE_CURRENT_SOURCE_DIR}CONFIGURE_DEPENDS"*.cpp")message("ALL_SOURCES =${ALL_SOURCES}")#[[ALL_SOURCES=a/a.cpp;build/CMakeFiles/4.2.1/CompilerIdCXX/CMakeCXXCompilerId.cpp;main.cpp;mycul.cpp]]# 可以发现,递归搜索出了目录下面的所有.cpp文件message("###############################")file(WRITE"version.txt""hello cmake")#追加file(APPEND"version.txt""\nhello APPEND")# 读文件file(READ"version.txt"CONTENTS)message("CONTENTS =${CONTENTS}")#[[CONTENTS=hello cmake hello APPEND]]# 按行读file(STRINGS"version.txt"lines)message("line =${lines}")# line = hello cmake;hello APPEND# 拷贝一份#file(COPY "version.txt" DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/a/version.txt")# 重命名:将 a/version.txt 重命名为 a/version2.txt# file(RENAME "${CMAKE_CURRENT_SOURCE_DIR}/a/version.txt" "${CMAKE_CURRENT_SOURCE_DIR}/a/version2.txt")# 删除文件或目录file(REMOVE"${CMAKE_CURRENT_SOURCE_DIR}/a/version2.txt")add_executable(testfile${SOURCES})
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/8 0:52:31

AI教你高效使用git cherry-pick合并多个commit

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个交互式教程&#xff0c;演示如何使用git cherry-pick命令选择性地合并多个commit。要求包含以下功能&#xff1a;1) 解释git cherry-pick的基本概念和适用场景&#xff1b…

作者头像 李华
网站建设 2026/2/8 4:04:10

Linly-Talker能否实现背景场景动态切换?

Linly-Talker能否实现背景场景动态切换&#xff1f; 在虚拟主播、AI客服和数字员工日益普及的今天&#xff0c;用户对数字人的期待早已超越“能说会动”的基础功能。一个真正沉浸式的交互体验&#xff0c;不仅要求口型精准、表情自然&#xff0c;更需要场景的多样性与动态感——…

作者头像 李华
网站建设 2026/2/8 0:48:24

如何用AI加速SLAM算法开发?快马平台实战指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个基于视觉的SLAM算法实现&#xff0c;要求包含以下功能&#xff1a;1) 使用ORB特征点检测与匹配 2) 实现基于RANSAC的位姿估计 3) 构建稀疏点云地图 4) 包含闭环检测模块。…

作者头像 李华
网站建设 2026/2/12 17:21:12

为什么Open-AutoGLM将成为端侧大模型标配?真相令人震惊!

第一章&#xff1a;Open-AutoGLM 与端侧大模型协同进化的必然趋势随着边缘计算能力的持续增强和大模型轻量化技术的突破&#xff0c;端侧部署大型语言模型&#xff08;LLM&#xff09;正从理论探索走向规模化落地。Open-AutoGLM 作为开源自动化生成语言模型框架&#xff0c;其核…

作者头像 李华
网站建设 2026/2/8 17:20:15

计算机毕业设计|基于springboot + vue乡村振兴服务系统(源码+数据库+文档)

乡村振兴服务 目录 基于springboot vue乡村振兴服务系统 一、前言 二、系统功能演示 详细视频演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue乡村振兴服务系统 一、前言…

作者头像 李华
网站建设 2026/2/9 3:13:49

AI助力UniApp开发:一键生成二维码功能

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个UniApp应用&#xff0c;需要实现以下功能&#xff1a;1. 用户输入文本或URL 2. 点击生成按钮后显示对应的二维码 3. 支持保存二维码到相册。使用vue语法&#xff0c;集成u…

作者头像 李华