Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake:如何为可执行文件添加对链接器脚本的依赖_Cmake - Fatal编程技术网

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脚本,其中最终可执行文件与我自己的链接器脚本链接:

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}
来搜索定义了
添加可执行文件的目录。