CMake使用file(GLOB ...)需要注意的问题

file(GLOB ...) 命令用于获取匹配指定模式的文件列表。在 CMake 中,file(GLOB ...) 命令的一种常见用法是用于收集源文件列表,例如 C++ 源文件(.cpp)和 C 源文件(.c)。然而,需要注意一些潜在的问题,特别是在大型项目中。

基本语法

file(GLOB variable [LIST_DIRECTORIES true|false] [RELATIVE path] [CONFIGURE_DEPENDS] [globbingexpressions]...)

其中:

  • variable 是一个存储匹配文件列表的变量名。
  • LIST_DIRECTORIES 是一个可选的参数,用于指定是否包含目录,默认为 true
  • RELATIVE path 是一个可选的参数,用于指定相对路径,文件匹配将从这个相对路径开始。
  • CONFIGURE_DEPENDS 是一个可选的参数,用于指定是否在构建时重新计算文件依赖关系。

使用例子

以下是一个使用 file(GLOB ...) 命令获取 C++ 和 C 源文件列表的例子:

file(GLOB CPP_SOURCES *.cpp)
file(GLOB C_SOURCES *.c)

# 将 C++ 和 C 源文件合并到一个变量中
set(SOURCES ${CPP_SOURCES} ${C_SOURCES})

# 在 add_executable 或 add_library 中使用这个变量
add_executable(my_executable ${SOURCES})

潜在的问题

虽然使用 file(GLOB ...) 简便,但有一些潜在的问题:

  1. 不会自动检测新增或删除的文件: 使用 file(GLOB ...) 时,CMake 不会自动检测源文件的变化,因此在添加或删除源文件时,需要手动重新运行 CMake。

  2. 不建议在大型项目中使用: 对于大型项目,由于可能包含大量的源文件,使用 file(GLOB ...) 可能会导致性能问题。

大型项目中推荐的用法

在大型项目中,推荐使用显式列出源文件的方式,例如:

set(SOURCES
    src/file1.cpp
    src/file2.cpp
    src/file3.cpp
    # ...
    src/main.cpp
)

add_executable(my_executable ${SOURCES})

这样可以更明确地指定源文件,避免潜在的问题。

cmake file(glob) 是指使用 CMake 中的 file() 命令结合 GLOB_RECURSE 选项来匹配指定路径下所有符合通配符条件的文件。具体来说,使用 file(GLOB_RECURSE) 命令可以递归查找目录下的所有文件,并将它们存储在一个变量中,以供后续的操作使用。通常会与其他 CMake 命令结合使用,比如在项目的 CMakeLists.txt 文件中使用 file(GLOB_RECURSE) 命令来查找所有以特定后缀名结尾的文件,并将它们添加到源文件列表中,以便用于编译生成可执行文件等操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++-Cmake指令:file【文件操作命令】【比如:file GLOB命令主要用于匹配规则在指定的目录内匹配到所需要的...](https://blog.csdn.net/u013250861/article/details/127936519)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [CMake 中,‘file(GLOB_RECURSE)‘含义及用法](https://blog.csdn.net/qq_21118315/article/details/130540302)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林树杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值