CMake笔记之GLOB和GLOB_RECURSE的使用方法

news2024/11/27 14:41:32

CMake笔记之GLOB和GLOB_RECURSE的使用方法

—— 杭州 2024-03-19 夜

文章目录

  • CMake笔记之GLOB和GLOB_RECURSE的使用方法
    • 1.GLOB使用方法
    • 2.GLOB对比GLOB_RECURSE

1.GLOB使用方法

在 CMake 中,file(GLOB ...) 命令用于将匹配特定模式的文件列表赋值给变量。这可以用来自动收集源代码文件列表,而不是手动指定每个文件。

然而,这种做法有一个潜在的问题:如果新文件被添加到目录中,CMake 不会自动知道需要重新运行以更新文件列表。这意味着您可能需要手动重新运行 CMake 以确保新文件被包含在构建中。由于这个原因,显式指定源文件通常是推荐的做法。

但是,如果你确定要使用 file(GLOB ...),以下是一个示例:

假设你的项目目录结构如下:

/my_project
|-- CMakeLists.txt
|-- src
|   |-- main.cpp
|   |-- utility.cpp
|   |-- helper.cpp
|-- include
    |-- utility.h
    |-- helper.h

/my_project/CMakeLists.txt 中,你可以使用 file(GLOB ...) 来收集源文件:

cmake_minimum_required(VERSION 3.10)
project(MyProject)

# 设置变量包含所有源文件
file(GLOB MY_PROJECT_SOURCES "src/*.cpp")

# 设置变量包含所有头文件
file(GLOB MY_PROJECT_HEADERS "include/*.h")

# 创建可执行文件
add_executable(MyProject ${MY_PROJECT_SOURCES})

# 包含头文件目录
target_include_directories(MyProject PRIVATE include)

在上面的例子中,file(GLOB MY_PROJECT_SOURCES "src/*.cpp") 将会在 src 目录下匹配所有 .cpp 文件,并将它们的列表赋值给变量 MY_PROJECT_SOURCES

以下表格总结了 file(GLOB ...) 的基本用法:

命令描述
file(GLOB VAR <pattern1> [<pattern2> ...])将所有匹配模式 <pattern> 的文件赋值给变量 VAR
file(GLOB VAR RELATIVE <path> <pattern1> [<pattern2> ...])GLOB 类似,但是返回的文件路径是相对于给定的 <path>
file(GLOB_RECURSE VAR <pattern1> [<pattern2> ...])递归地将所有匹配模式的文件赋值给变量 VAR
file(GLOB_RECURSE VAR RELATIVE <path> <pattern1> [<pattern2> ...])GLOB_RECURSE 类似,但是返回的文件路径是相对于给定的 <path>

请记住,GLOB 会捕获所有匹配模式的文件,包括可能不想包含在项目中的文件。另外,由于 GLOB 不会导致 CMake 在新文件添加到目录中时自动重新运行,因此可能会导致构建系统与文件系统状态不同步。因此,谨慎使用,并确保了解其潜在影响。

2.GLOB对比GLOB_RECURSE

使用 file(GLOB_RECURSE ...) 示例:

如果你想要递归地匹配指定模式的文件,可以使用 file(GLOB_RECURSE ...)。例如:

# 递归地搜索所有的 .cpp 文件
file(GLOB_RECURSE SOURCES "src/*.cpp")

# 递归地搜索所有的 .h 文件
file(GLOB_RECURSE HEADERS "include/*.h")

这将会在 srcinclude 目录及其所有子目录中搜索 .cpp.h 文件。

表格说明:

命令描述示例
file(GLOB ...)匹配给定模式的文件,不递归子目录。file(GLOB MY_SRCS "src/*.cpp")
file(GLOB_RECURSE ...)递归匹配给定模式的文件。file(GLOB_RECURSE MY_SRCS "src/**/*.cpp")

在实际项目中,出于上述提到的原因,很多开发者更倾向于显式地列出源文件,以确保 CMake 在文件改动时能够正确地重新生成构建系统。但在某些情况下,如果文件经常变化,而且你不想每次都手动更新 CMakeLists.txt 文件,使用 GLOB 可能会更方便。只要记得在添加或删除文件后,要重新运行 CMake 以更新构建系统。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1530532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML静态网页成品作业(HTML+CSS)——动漫猫和老鼠网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

5 个去除图像水印的工具学习分享

水印可能是保护图像并防止它们成为未经授权使用的受害者的最常见技术。 但是&#xff0c;在某些情况下您可能需要从图像中删除水印。也许它遮挡了照片上的一些重要细节&#xff0c;或者您可能希望它&#xff08;水印&#xff09;位于图像的另一侧&#xff09;。无论出于何种原…

蓝桥练习题总结(一)字母图形、完美的代价、01串、序列求和

目录 一、字母图形 二、完美的代价 三、01字串 四、序列求和 一、字母图形 问题描述 利用字母可以组成一些美丽的图形&#xff0c;下面给出了一个例子&#xff1a; ABCDEFG BABCDEF CBABCDE DCBABCD EDCBABC 这是一个5行7列的图形&#xff0c;请找出这个图形的规律&#xff…

jmeter之Http请求默认值与Http信息头管理器-第五天

1.Http请求默认值 点击测试计划-右键-添加-配置元件-Http请求默认值 http请求默认值&#xff1a;设置重复的字段 2.Http信息头管理器 点击测试计划-右键-添加-配置元件-Http信息头管理器 http信息头管理器&#xff1a; 新增修改实现时提交的数据是JSON 格式的&#xff0c;…

OpenResty使用Lua大全(十二)实战: 动手实现一个网关框架

文章目录 系列文章索引一、网关基本介绍1、网关常用功能2、本次实战目标3、orange介绍4、安装orange 二、动手实现网关1、主入口&#xff08;1&#xff09;nginx的conf配置&#xff08;2&#xff09;网关lua&#xff1a;gateway.lua&#xff08;3&#xff09;启动 2、gateway网…

camunda 与 pycamunda学习

camunda 与 pycamunda 相关链接&#xff1a; camunda 官方社区&#xff1a;https://docs.camunda.org/manual/7.17/ 官方社区提供的REST_API:https://docs.camunda.org/manual/7.17/reference/rest/ GITHUB 社区&#xff1a;https://github.com/camunda-community-hub Git…

【机器学习】机器学习实验方法与原则(统计有效性检验详解)

统计有效性检验 假设的评估检验&#xff1a;问题1 • 效果估计 • 给定一个假设 在有限量数据 上的准确率 • 该准确率是否能准确估计 在其它未见数据上 的效果&#xff1f; 假设的评估检验&#xff1a;问题2 • h 1 在数据的一个样本集上表现优于 h 2 • h 1 总体…

ubuntu下samba匿名读写服务器

目的&#xff1a; 局域网内&#xff0c;ubuntu下&#xff0c;创建SAMBA文件共享服务器。匿名读写权限。为了开发项目组文件共享传输方便。 环境&#xff1a; X86_64电脑一台。 操作系统&#xff1a; Ubuntu 20.04 LTS 64位。 安装samba $ sudo apt-get install samba创建…

缅甸的大开发时代即将到来 缅文wordpress主题模板

Simplify WordPress外贸网站模板 Simplify WordPress外贸网站模板&#xff0c;简洁实用的外贸公司wordpress外贸建站模板。 https://www.jianzhanpress.com/?p4565

爬虫(七)

1.批量爬取知网数据 lxml:是 Python 的一个功能强大且易用的 XML 和 HTML 处理库。它提供了简单又轻巧的 API,使得解析、构建和操作 XML 和 HTML 文档变得非常方便。lxml 库通常用于处理 XML 和 HTML 文档,例如解析网页、处理配置文件等。openpyxl:是 Python 中用于操作 Ex…

Basic RNN

文章目录 回顾RNNRNN CellRNNCell的使用RNN的使用 RNN例子使用RNN Cell实现使用RNN实现 嵌入层 Embedding独热向量的缺点Embedding LSTMGRU(门控循环单元)练习 回顾 DNN&#xff08;全连接&#xff09;&#xff1a;和CNN相比&#xff0c;拥有巨大的参数量&#xff0c;CNN权重共…

哔哩哔哩秋招Java二面

前言 作者&#xff1a;晓宜 个人简介&#xff1a;互联网大厂Java准入职&#xff0c;阿里云专家博主&#xff0c;csdn后端优质创作者&#xff0c;算法爱好者 一面过后面试官叫我别走&#xff0c;然后就直接二面&#xff0c;二面比较简短&#xff0c;记录一下&#xff0c;希望可以…

charles使用教程 ---- 抓取https请求 修改请求

目录 简介 将 Charles 设置成系统代理 截取 Https 通讯信息 配置想要抓取数据的地址 在电脑上安装证书 设置HTTP和HTTPS代理 抓包工具charles修改请求和返回数据 简介 Charles 是在 Mac 下常用的网络封包截取工具&#xff0c;在做 移动开发时&#xff0c;我们为了调试与…

MNN createSession 之创建流水线后端(四)

系列文章目录 MNN createFromBuffer&#xff08;一&#xff09; MNN createRuntime&#xff08;二&#xff09; MNN createSession 之 Schedule&#xff08;三&#xff09; MNN createSession 之创建流水线后端&#xff08;四&#xff09; MNN Session::resize 之流水线编码&am…

【刷题】滑动窗口入门

送给大家一句话&#xff1a; 那脑袋里的智慧&#xff0c;就像打火石里的火花一样&#xff0c;不去打它是不肯出来的。——莎士比亚 滑动窗口入门 认识滑动窗口Leetcode 209. 长度最小的子数组题目描述算法思路 Leetcode 3. 无重复字符的最长子串题目描述算法思路 Leetcode 1004…

Invicti v24.3.0 for Windows - Web 应用程序安全测试

Invicti v24.3.0 for Windows - Web 应用程序安全测试 Invicti Standard 12 Mar 2024 v24.3.0 请访问原文链接&#xff1a;https://sysin.org/blog/invicti/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Invicti 是一种自动…

什么是 JVM 双亲委派机制?

什么是 JVM 双亲委派机制&#xff1f; 题目 什么是 JVM 双亲委派机制&#xff1f; 推荐解析 通俗的说&#xff0c;双亲委派模型&#xff0c;就是加载类的时候&#xff0c;先请求其父类加载器去加载&#xff0c;如果父类加载器无法加载类&#xff0c;再尝试自己去加载类。如…

npm install不成功

解决办法&#xff1a; $env:NODE_OPTIONS"--openssl-legacy-provider" npm run dev

HarmonyOS应用开发实战 - Api9 拍照、拍视频、选择图片、选择视频、选择文件工具类

鸿蒙开发过程中&#xff0c;经常会进行系统调用&#xff0c;拍照、拍视频、选择图库图片、选择图库视频、选择文件。今天就给大家分享一个工具类。 1.话不多说&#xff0c;先展示样式 2.设计思路 根据官方提供的指南开发工具类&#xff0c;基础的拍照、拍视频、图库选照片、选…

【mybatis】objectwrapper解读

简介 在 MyBatis 中&#xff0c;ObjectWrapper 是一个关键的接口&#xff0c;用于详细封装了对象的属性信息。ObjectWrapper 主要用于内部操作&#xff0c;它抽象了对象的属性操作&#xff0c;使得 MyBatis 能够统一处理原生类型、Bean 对象以及 Map 集合等。 类图展示 主要功…