You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何CMake install DIRECTORY命令安装空目录?如何仅装含匹配文件的目录?

解决CMake安装时仅保留含匹配文件目录的问题

针对你遇到的install(DIRECTORY)会复制不含.h文件的空目录问题,在CMake 3.22.1版本下可以用以下两种方法解决:

方法1:先筛选含目标文件的目录再安装

这种方法通用性最强,先递归找出所有包含.h文件的目录,再对这些目录执行安装操作,从根源上避免空目录被复制:

# 递归查找所有.h文件
file(GLOB_RECURSE HEADER_FILES "${CMAKE_BINARY_DIR}/*.h")
# 提取每个头文件的所在目录并去重
set(TARGET_INSTALL_DIRS "")
foreach(HEADER_PATH IN LISTS HEADER_FILES)
    get_filename_component(CURRENT_DIR "${HEADER_PATH}" DIRECTORY)
    list(APPEND TARGET_INSTALL_DIRS "${CURRENT_DIR}")
endforeach()
list(REMOVE_DUPLICATES TARGET_INSTALL_DIRS)

# 安装筛选后的目录,仅保留.h文件
install(DIRECTORY ${TARGET_INSTALL_DIRS}
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
    OPTIONAL
    FILES_MATCHING PATTERN "*.h"
)

方法2:手动排除已知空目录(灵活性较差)

如果你的项目目录结构固定,明确知道哪些子目录不会包含.h文件,可以直接用PATTERN ... EXCLUDE排除这些目录:

install(DIRECTORY ${CMAKE_BINARY_DIR}
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
    OPTIONAL
    FILES_MATCHING PATTERN "*.h"
    # 示例:排除build和temp目录
    PATTERN "build/*" EXCLUDE
    PATTERN "temp/*" EXCLUDE
)

推荐优先使用方法1,它不需要提前知晓目录结构,能自动适配所有含.h文件的目录。

内容的提问来源于stack exchange,提问作者MBagher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 09:26:02