CMake:如何为可执行文件添加对链接器脚本的依赖
我有一个CMake脚本,其中最终可执行文件与我自己的链接器脚本链接:CMake:如何为可执行文件添加对链接器脚本的依赖,cmake,Cmake,我有一个CMake脚本,其中最终可执行文件与我自己的链接器脚本链接: cmake_minimum_required(VERSION 3.1) project(test_app) set(LINKER_SCRIPT "linker.ld") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T ${LINKER_SCRIPT}") add_executable(${PROJECT_NAME}.elf main.cpp
cmake_minimum_required(VERSION 3.1)
project(test_app)
set(LINKER_SCRIPT "linker.ld")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T ${LINKER_SCRIPT}")
add_executable(${PROJECT_NAME}.elf
main.cpp
startup.cpp
)
如何使可执行文件也依赖于链接器脚本文件(如果linker.ld
已更改,则触发链接)?我找到了强制可执行文件依赖于链接器脚本的三种可能方法。其作者更喜欢这种方式:
CMakeLists.txt:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR)
PROJECT(LINKERSCRIPT C)
FILE(WRITE main.c "void main(){}")
# dummy.c must exist:
ADD_EXECUTABLE(EXE main.c dummy.c)
# linkerscript must exist:
SET_SOURCE_FILES_PROPERTIES(
dummy.c PROPERTIES OBJECT_DEPENDS ${CMAKE_SOURCE_DIR}/linkerscript
)
这里的dummy.c
是一个空文件,它是为add_executable()
命令列出的,仅用于通过属性使生成的可执行文件依赖于链接器脚本。您可以使用将属性添加到可执行目标。在Add_executable
命令后添加以下行:
set_target_properties(${TARGET_NAME} PROPERTIES LINK_DEPENDS ${LINKER_SCRIPT})
set\u target\u properties
的第一个参数是目标名称,即传递给add\u executable
的第一个参数是如何生成此脚本的add_custom_target()
?链接器脚本是手工编辑的,此时如果我在此脚本中进行更改,则必须重新生成项目。我尝试添加以下内容:add_custom_target(OUTPUT${project_NAME}.elf依赖于${Linker_script})
,但未成功。请参阅target属性。这适用于所有的makefile
生成器,除了-到目前为止-对于忍者(将用CMake 3.4修复,请参见)Florian,看起来这是正确的方法,对我有效(我使用makefile),你能创建一个答案吗,我接受。谢谢。是的,我知道这个使用dummy.c文件的解决方案,但我认为它不是很优雅。例如,如果我在Makefile中添加空目标:outupt.elf:linker.ln
在链接目标:output.elf:main.o startup.o
旁边,那么我就得到了我想要的,但我不知道如何使用CMake创建空目标,或者这是否可行。是的,直接使用Makefile,添加链接器依赖项更简单、更优雅。但CMake不允许为一个文件多次添加依赖项。第一次在add_executable()
call中添加依赖项,但它们都应该是源文件或头文件,因此在此阶段不能添加链接器依赖项。从另一方面来说,您不必为CMake生成的Makefiles操心。在任何情况下,它们都比手动编写的文件复杂得多。问题是cmake在生成目录而不是源目录中搜索${LINKER\u SCRIPT}
。实际上,我有一个解决方案,可以添加${CMAKE\u SOURCE\u DIR}/${LINKER\u SCRIPT}
或${CMAKE\u CURRENT\u SOURCE\u DIR}/${LINKER\u SCRIPT}
来搜索定义了添加可执行文件的目录。