我在CMake项目中有多个目标。每个目标都有一个不同的链接脚本(LD文件)。如何编写CMakeLists.txt文件以实现此目的?这适用于具有C / C ++ / ASM文件的嵌入式项目。
这是我到目前为止所拥有的。问题在于LINKER_SCRIPT是全局定义的,而不是按目标定义的。
# add alpha target
add_executable(alpha.elf ${SOURCES})
target_compile_definitions(alpha.elf PUBLIC -DALPHA_DEFINED)
set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/Linker/alpha.ld)
# add beta target
add_executable(beta.elf ${SOURCES})
target_compile_definitions(beta.elf PUBLIC -DBETA_DEFINED)
set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/Linker/beta.ld)
set(CMAKE_EXE_LINKER_FLAGS
"${CMAKE_EXE_LINKER_FLAGS} -T ${LINKER_SCRIPT}")
问题是LINKER_SCRIPT被覆盖,最后一个定义是所使用的。我该如何工作?
我尝试使用以下方法定义每个目标变量,但是输出不符合预期。该文件被编译,但是事情不在应该的地方。例如,生成的HEX文件不是从0x08000000开始的,而该文件应在每个LD文件中定义。
set_target_properties(alpha.elf PROPERTIES
CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Map=${PROJECT_BINARY_DIR}/alpha.elf.map -T ${CMAKE_SOURCE_DIR}/Linker/alpha.ld")
答案 0 :(得分:1)
第二次将变量LINKER_SCRIPT
设置为值时,该变量被覆盖。它没有全局范围,但有子目录/功能范围。但是,就像任何变量一样,它采用最新值。
CMAKE_EXE_LINKER_FLAGS
。将其拆分为单独的子目录可能有效,但我从未尝试过。
我不知道每个目标变量。 set_target_properties
用于设置属性。 CMake知道某些属性,但是属性CMAKE_EXE_LINKER_FLAGS
不是其中之一。生成构建文件时应该忽略它。
尝试使用target_link_options
设置已知的每个目标属性LINK_OPTIONS
,并且在链接可执行文件时将显示该选项。
例如target_link_options(alpha.elf PRIVATE -T${CMAKE_SOURCE_DIR}/Linker/alpha.ld)
。我没有将其与在其中带有空格的选项一起使用,所以可能是一个问题。
要重新链接(如果链接描述文件更改),请参考以下答案: https://stackoverflow.com/a/42138375/1028434