如何为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
相关产品推荐
相关产品推荐

