You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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为你想要的路径,比如:
    cmake -S . -B build -DCMAKE_INSTALL_PREFIX=./install_dir
    
    然后进入build目录执行make install,文件就会复制到项目根目录下的install_dir里了。

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

火山引擎 最新活动