相同的来源,2 个不同的二进制文件,带有一个链接器脚本变量

Same sources, 2 different binaries with a linker script variable

使用 CMake,我尝试使用相同的来源和相同的 linker 脚本来生成两个不同的二进制文件。

/* Specify the memory areas */
MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 320K
FLASH (rx)     : ORIGIN = APP_ORIGIN, LENGTH = 0x40000
}

APP_ORIGIN 在 linker 脚本中设置为输入,使用 --defsym=APP_ORIGIN=VALUE .

set(APP1_ORIGIN 0x0800C200)
set(APP2_ORIGIN 0x0804C200)
SET(CMAKE_EXE_LINKER_FLAGS "-T${LINKER_FILE} -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -specs=nano.specs -lc -lm -lnosys -Wl,-Map=${PROJECT_NAME}.map,--cref -Wl,--gc-sections -Xlinker -print-memory-usage -Xlinker --defsym=APP_ORIGIN=${APP1_ORIGIN}")

重点是我知道如何用APP2_ORIGIN值修改CMAKE_EXE_LINKER_FLAGS并触发link 再次.

这可以用 2 个不同的目标来完成,但是如果只有一个 linker 脚本,只需要维护一个,因为应用程序完全相同,只有偏移量变化.

我尝试了 POST_BUILD 自定义目标的不同方法,但直到现在都没有成功。

文件是从输入 模板.生成的

创建文件inputfile:

/* Specify the memory areas */
MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 320K
FLASH (rx)     : ORIGIN = @APP_ORIGIN@, LENGTH = 0x40000
}

然后做:

configure_file(inputfile ${CMAKE_BUILD_DIR}/linkerscript1 @ONLY)
configure_file(inputfile ${CMAKE_BUILD_DIR}/linkerscript1 @ONLY)

或者与 add_custom_command 和自定义脚本相同。

然后做:

add_library(allobjectfiles all_your_files.c)  # maybe OBJECT library?
 
add_executable(yourtarget)
target_link_libraries(yourtarget allobjectfiles)
target_link_options(yourtarget PUBLIC
     -T${CMAKE_BUILD_DIR}/linkerscript1
)
set_target_properties(yourtarget PROPERTIES LINK_DEPENDS
     ${CMAKE_BUILD_DIR}/linkerscript1
)

# Repeat above for linkerscript2 with different target name