【发布时间】:2020-01-15 03:07:42
【问题描述】:
我正在使用 CMake 为 ARM Cortex-M 进行交叉编译以配置项目。
到目前为止,我已经成功地设置了项目并且正在生成可执行文件。但是,要刷新电路板,我需要一个“.hex”。文件。
我已经按照 gcc 的 Nordic nRF5SDK 示例来获取有关编译和链接阶段的一些线索,并将它们传递给 CMake 例程。
但是,我无法生成任何“.out”文件来正确提取“.hex”文件。 我玩过编译标志和链接器标志,但没有成功。
我已经在工具链文件和编译器中设置了初始化标志,十六进制是使用自定义命令生成的:
(...)
add_executable(main main.c)
target_link_libraries(main sdk_lib)
add_custom_command(
TARGET
main
POST_BUILD
COMMAND
${ARM_OBJCOPY} -O ihex ${CMAKE_CURRENT_BINARY_DIR}/main${CMAKE_EXECUTABLE_SUFFIX} ${CMAKE_SOURCE_DIR}/main.hex
)
(...)
问题是我使用二进制文件来提取十六进制,而不是正确的“.out”文件。
如何在不使用与主构建并行的另一个自定义命令的情况下生成它?
P.S.:这是项目的当前状态https://github.com/NunoRVicente/cmake-arm-toolchain
【问题讨论】:
-
你不能。您必须调用 objcopy。这还不错,一旦开始调试,无论如何您都将需要 elf 文件。把它变成custom targettho。
to flash the board I need an ".hex". file- 这很奇怪。 openocd和gdb可以刷elf文件。 -
You can't. You have to invoke objcopy.这就是我现在正在做的事情。但是 objcopy 适用于目标文件,这就是我遇到的麻烦。嗯,你是对的。当我说我需要一个“.hex”时,我实际上是在使用 nRF 命令行工具,而 nrfjprog 只使用“.hex”。在与 CLion 合作时,我将探索更多 OpenOCD,这可能是一个更好的选择。 -
好吧,我有
st-flash,最好只使用十六进制,为了简单起见,我只是用such script 包装它。objcopy works with object files, and that's what I am having troubles with- 为什么麻烦?您将始终从编译中获得一个 elf 文件。那你就只objcopy吧。
标签: cmake cmake-language