我在一个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")
发布于 2019-05-02 12:14:56
当您第二次将变量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
https://stackoverflow.com/questions/55959247
复制