CMake:如何为每个目标指定不同的链接脚本

时间:2019-05-02 19:46:16

标签: cmake linker

我在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")

1 个答案:

答案 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