CMake的INSTALL FILES和INSTALL DIRECTORY有什么区别


在 CMake 中,install() 命令用于安装构建的目标文件、头文件、库等到指定的目标路径。install(FILES ...)install(DIRECTORY ...) 都是 install() 命令的具体用法,它们的功能和适用场景不同。

以下是两者的详细区别和用法说明:


1. install(FILES ...)

功能

  • 直接安装指定的文件到目标路径。
  • 适用于安装单个文件(如头文件、配置文件等)。

语法

install(FILES file1 file2 ... DESTINATION target_directory [OPTIONAL_ARGUMENTS])

参数说明

  • FILES: 需要安装的文件列表。
  • DESTINATION: 安装的目标路径,相对于 CMAKE_INSTALL_PREFIX
  • 可选参数:
    • PERMISSIONS: 指定文件权限(如 OWNER_READ, OWNER_WRITE 等)。
    • RENAME: 重命名文件时使用。

示例

# 将头文件安装到目标 include 目录
install(FILES header1.h header2.h DESTINATION include)

# 将文件安装到目标路径并设置权限
install(FILES config.json DESTINATION etc
    PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
)

2. install(DIRECTORY ...)

功能

  • 递归安装整个目录的内容到目标路径。
  • 适用于安装文件夹及其子文件夹中的所有内容。

语法

install(DIRECTORY dir1 dir2 ... DESTINATION target_directory [OPTIONAL_ARGUMENTS])

参数说明

  • DIRECTORY: 需要安装的目录列表。
  • DESTINATION: 安装的目标路径,相对于 CMAKE_INSTALL_PREFIX
  • 可选参数:
    • FILES_MATCHING: 只安装符合指定模式的文件。
    • PATTERNREGEX: 用于过滤文件或目录的匹配模式。
    • EXCLUDE: 排除匹配的文件或目录。

示例

# 将目录的内容递归安装到目标路径
install(DIRECTORY my_include/ DESTINATION include)

# 只安装特定扩展名的文件(如 .h 文件)
install(DIRECTORY my_include/ DESTINATION include
    FILES_MATCHING PATTERN "*.h"
)

# 排除特定目录
install(DIRECTORY my_project/ DESTINATION project
    PATTERN "build" EXCLUDE
)

主要区别

特性install(FILES)install(DIRECTORY)
用途安装指定的单个或多个文件安装整个目录及其内容
递归处理子目录不支持支持递归安装目录及其子目录
支持过滤和模式匹配不支持支持通过 PATTERNREGEX 进行过滤
适用场景安装头文件、配置文件、库文件等安装包含多个文件或目录的资源(如源码、数据、文档等)
排除内容不支持支持使用 EXCLUDE 排除匹配的文件或目录

使用建议

  • install(FILES): 当需要安装少量的特定文件时使用。
  • install(DIRECTORY): 当需要递归安装整个目录(如头文件目录、资源目录)时使用,尤其是需要过滤或排除特定文件时。

示例:结合使用 FILESDIRECTORY

# 将单个文件安装到配置目录
install(FILES config.json DESTINATION etc)

# 将整个头文件目录安装到目标 include 目录
install(DIRECTORY my_include/ DESTINATION include)

# 仅安装特定文件类型(如 .h 和 .cpp 文件),排除子目录中的文件
install(DIRECTORY my_src/ DESTINATION src
    FILES_MATCHING PATTERN "*.h" PATTERN "*.cpp"
    PATTERN "tests" EXCLUDE
)

总结

  • 使用 install(FILES) 直接安装单个或多个文件,适合静态文件或非递归安装场景。
  • 使用 install(DIRECTORY) 递归安装整个目录,适合安装复杂的目录结构或需要文件过滤的场景。
### 使用 CMake 进行安装的指南 #### 安装目标定义 为了使项目能够通过 `make install` 或者其他构建工具执行安装操作,需要在项目的顶层 `CMakeLists.txt` 文件中指定安装规则。这通常涉及到使用 `install()` 命令来描述哪些文件应当被复制到哪里。 ```cmake # 设置可执行文件其他资源的目标位置 install(TARGETS myExecutable DESTINATION bin) # 如果有库也需要分发,则可以这样处理 install(TARGETS myLibrary EXPORT myProjectConfig DESTINATION lib) ``` 上述命令指定了当调用 `make install` 时应将编译后的二进制文件放置于系统的 `/usr/local/bin` 下面,并且对于共享库来说则是放在 `/usr/local/lib` 中[^1]。 #### 配置头文件路径 除了程序本身之外,有时还需要发布一些公共接口给第三方开发者使用。此时可以通过如下方式把包含目录加入到安装列表里: ```cmake # 将 include 目录下的所有 .h 头文件都打包进去 install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/ DESTINATION include/myproject FILES_MATCHING PATTERN "*.h") ``` 这段脚本会确保所有的 `.h` 文件会被正确地部署至相应的位置以便后续链接开发工作所需[^2]。 #### 创建包管理器支持 为了让软件更容易被集成进不同的操作系统环境当中去,还可以考虑生成适用于各大平台的标准格式包(如 Debian 的 deb, RedHat 的 rpm)。为此可以在根级 CMake 脚本内添加额外的支持模块: ```cmake include(InstallRequiredSystemLibraries) # 自动检测并拉取依赖项 set(CPACK_PACKAGE_NAME "MyProject") # 设定打包名称 set(CPACK_GENERATOR "DEB;RPM") # 制作 DEB RPM 类型包体 include(CPack) # 启用 CPack 功能组件 ``` 此部分配置允许用户不仅限于手动拷贝文件完成安装过程;而是可以直接利用系统自带的包管理系统来进行更便捷的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Prejudices

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

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

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

打赏作者

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

抵扣说明:

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

余额充值