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

如何为CMake的add_executable()命令添加链接阶段依赖?

问题:如何让CMake在链接脚本更新时触发可执行文件的重链接?

我希望使用指定的链接脚本文件my.linkcmds构建可执行文件,且当更新该链接脚本时,能触发add_executable()的链接阶段。我使用了如下CMakeLists.txt配置:

cmake_minimum_required (VERSION 3.22)
project (HELLO)

set(LNK_SCRIPT ${CMAKE_SOURCE_DIR}/my.linkcmds)
add_custom_target(hello_linkcmd DEPENDS ${LNK_SCRIPT})

add_executable       (hello main.c)
target_link_libraries(hello -T ${LNK_SCRIPT})
add_dependencies     (hello hello_linkcmd)

问题:当我更新my.linkcmds时,仅更新了主目标但未重新执行链接阶段:

$ touch ../my.linkcmds
$ make
[  0%] Built target hello_linkcmd
[100%] Built target hello

我当前的临时解决方案是将依赖设置到源文件,触发main.o重新编译以强制hello重链接,但这并不优雅,因为此时不需要重新编译源码!

set_source_files_properties(main.c OBJECT_DEPENDS ${LNK_SCRIPT_TEMPLATE})

请问为add_executable()命令的链接阶段添加依赖的最优方式是什么?


最优解决方案

直接利用CMake为目标提供的LINK_DEPENDS属性,该属性专门用于指定可执行文件/库在链接阶段需要依赖的文件,当这些文件更新时,CMake会自动触发重链接操作,无需额外编译源码。

修改后的CMake配置如下:

cmake_minimum_required (VERSION 3.22)
project (HELLO)

set(LNK_SCRIPT ${CMAKE_SOURCE_DIR}/my.linkcmds)

add_executable(hello main.c)
target_link_libraries(hello -T ${LNK_SCRIPT})
# 为目标添加链接阶段依赖
set_target_properties(hello PROPERTIES LINK_DEPENDS ${LNK_SCRIPT})

原理说明

  • LINK_DEPENDS属性会明确告诉CMake:该目标的链接步骤依赖于指定的my.linkcmds文件
  • 当my.linkcmds更新时,CMake会检测到依赖变化,直接触发目标的重链接流程,不会触发源码的重新编译,完全匹配需求
  • 无需额外创建自定义目标和添加依赖,配置更简洁直接

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:39:56