CMake中install(FILES)与file(INSTALL)的区别及使用疑问
为什么CMake中
file(INSTALL)可行而install(FILES)没达到预期效果? 这俩命令看着功能相似,但核心差异在执行时机和路径解析逻辑上,刚好踩中了你遇到的问题点:
1. 执行时机完全不同
file(INSTALL)是**CMake配置阶段(运行cmake命令时)**就直接执行的操作。你一跑cmake,它就立刻把文件复制到目标路径,所以你能马上看到结果。install(FILES)只是在配置阶段记录安装规则,真正的文件复制要等到安装阶段——也就是你执行make install(或者ninja install,取决于你的构建工具)的时候才会发生。你只跑cmake配置,它根本不会动文件。
2. 相对路径的解析规则不一样
两者对DESTINATION里的相对路径处理逻辑完全不同:
- 对于
file(INSTALL),相对路径是相对于你运行cmake命令的当前工作目录来解析的。你用../install_dir,就是cmake运行目录的上一级目录下的install_dir,所以配置时直接复制过去了。 - 对于
install(FILES),相对路径是相对于CMAKE_INSTALL_PREFIX这个CMake变量的默认值来解析的。默认情况下,这个变量的值是/usr/local(Linux/macOS)或者类似系统级目录,所以你写的./install_dir,实际目标路径是/usr/local/install_dir,而不是你当前项目目录下的install_dir。就算你后来执行make install,文件也会跑到系统目录里,不是你预期的地方。
怎么让install(FILES)达到你想要的效果?
如果你更倾向于用install(FILES)(毕竟这是CMake推荐的安装方式),可以这么调整:
- 要么指定绝对路径作为
DESTINATION,比如DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/install_dir(指向项目源码目录下的install_dir); - 要么在运行cmake时手动设置
CMAKE_INSTALL_PREFIX为你想要的路径,比如:
然后进入build目录执行cmake -S . -B build -DCMAKE_INSTALL_PREFIX=./install_dirmake install,文件就会复制到项目根目录下的install_dir里了。
内容的提问来源于stack exchange,提问作者Kennedy




