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

CMake中使用install(CODE)对已安装构建产物做后处理的路径问题

处理CMake install(CODE)默认工作目录的问题

嘿,我懂你遇到的问题了——你用install(TARGETS)把linktest目标安装到指定目录后,想用install(CODE)做后处理,结果发现它默认的工作目录是当前CMakeLists.txt对应的构建目录,完全不是你刚安装产物的地方,这确实有点坑。

别担心,这里有两个简单的办法能让install(CODE)的命令在安装目录下执行:

方法1:直接指定execute_process的工作目录

execute_process本身支持WORKING_DIRECTORY参数,你可以直接把安装路径传进去,这样命令就会在目标目录下跑了。结合你的场景,代码可以写成这样:

install(CODE "
  execute_process(
    COMMAND sh -c \"echo Do stuff in `pwd` && exit 0\"
    WORKING_DIRECTORY \"${CMAKE_INSTALL_PREFIX}\"
  )
" COMPONENT linkTest)

这里的${CMAKE_INSTALL_PREFIX}就是你设置的安装根目录,因为你的DESTINATION是.,所以实际安装产物的目录就是这个变量指向的路径。如果你的DESTINATION是子目录(比如bin),那就要写成${CMAKE_INSTALL_PREFIX}/bin。

方法2:在shell命令里先切换目录

如果你更习惯用shell的cd命令,也可以在sh -c的脚本里先切换到安装目录再执行操作,比如:

install(CODE "
  execute_process(
    COMMAND sh -c \"cd ${CMAKE_INSTALL_PREFIX} && echo Do stuff in `pwd` && exit 0\"
  )
" COMPONENT linkTest)

不过要注意,如果你的安装路径里包含空格,这种直接拼接的方式可能会出错,这时候可以用参数传递的方式来避免:

install(CODE "
  execute_process(
    COMMAND sh -c \"cd \\\"\\$1\\\" && echo Do stuff in \\`pwd\\` && exit 0\"
    ARGS \"${CMAKE_INSTALL_PREFIX}\"
  )
" COMPONENT linkTest)

额外提示

如果你是针对特定组件的安装路径,而组件的安装目录和默认的CMAKE_INSTALL_PREFIX不同,你可以提前设置CMAKE_INSTALL_PREFIX_<COMPONENT>变量,然后在install(CODE)里引用它,这样就能精准定位到组件的安装目录了。

最后,记得用make install VERBOSE=1或者cpack -V来查看详细输出,确认命令确实是在你期望的目录下执行的,这样能快速验证配置是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:03:46