【问题标题】:How to generate .out file with cmake?如何使用 cmake 生成 .out 文件?
【发布时间】: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


【解决方案1】:

why is it a trouble? 所以我想出了问题的根源。 基本上elf文件没有生成好,所以.hex自然也有问题。

现在这里的问题是要了解精灵为什么会被打破,它正在超越我的知识。 我已经使用 SDK 代码将 sdk_lib 构建为 STATIC,并包含头文件所在的目录。我已经添加了可执行文件并将主文件与 sdk_lib 链接起来。

当我分析编译过程时,OBJ文件都在生成,最后认为是链接的。但是有一些奇怪的东西我无法理解。

[95%] Building C object CMakeFiles/main.dir/main.c.obj
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-gcc -DBOARD_PCA10040 -DBSP_DEFINES_ONLY -DCONFIG_GPIO_AS_PINRESET -DFLOAT_ABI_HARD -DNRF52 -DNRF52832_XXAA -DNRF52_PAN_74 -D__HEAP_SIZE=8192 -D__STACK_SIZE=8192 -I/opt/nRF5_SDK_15.3.0_59ac345/components -I/opt/nRF5_SDK_15.3.0_59ac345/modules/nrfx/mdk -I/opt/nRF5_SDK_15.3.0_59ac345/components/libraries/strerror -I/opt/nRF5_SDK_15.3.0_59ac345/components/toolchain/cmsis/include -I/opt/nRF5_SDK_15.3.0_59ac345/components/libraries/util -I/opt/nRF5_SDK_15.3.0_59ac345/components/libraries/balloc -I/opt/nRF5_SDK_15.3.0_59ac345/components/libraries/ringbuf -I/opt/nRF5_SDK_15.3.0_59ac345/modules/nrfx/hal -I/opt/nRF5_SDK_15.3.0_59ac345/components/libraries/bsp -I/opt/nRF5_SDK_15.3.0_59ac345/components/libraries/log -I/opt/nRF5_SDK_15.3.0_59ac345/modules/nrfx -I/opt/nRF5_SDK_15.3.0_59ac345/components/libraries/experimental_section_vars -I/opt/nRF5_SDK_15.3.0_59ac345/components/libraries/delay -I/opt/nRF5_SDK_15.3.0_59ac345/integration/nrfx -I/opt/nRF5_SDK_15.3.0_59ac345/components/drivers_nrf/nrf_soc_nosd -I/opt/nRF5_SDK_15.3.0_59ac345/components/libraries/atomic -I/opt/nRF5_SDK_15.3.0_59ac345/components/boards -I/opt/nRF5_SDK_15.3.0_59ac345/components/libraries/memobj -I/opt/nRF5_SDK_15.3.0_59ac345/external/fprintf -I/opt/nRF5_SDK_15.3.0_59ac345/components/libraries/log/src -I/opt/nRF5_SDK_15.3.0_59ac345/examples/peripheral/blinky/pca10040/blank/config  -O0 -g0         -mcpu=cortex-m4         -mthumb         -mabi=aapcs         -Wall         -Wextra         -mfloat-abi=hard         -mfpu=fpv4-sp-d16         -ffunction-sections         -fdata-sections         -fno-strict-aliasing         -fno-builtin         -fshort-enums -g   -o CMakeFiles/main.dir/main.c.obj   -c /home/ricardo/Git/cmake-arm-toolchain/main.c
[100%] Linking C executable main
/home/ricardo/.local/share/JetBrains/Toolbox/apps/CLion/ch-0/192.6603.37/bin/cmake/linux/bin/cmake -E cmake_link_script CMakeFiles/main.dir/link.txt --verbose=1
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-gcc -O0 -g0         -mcpu=cortex-m4         -mthumb         -mabi=aapcs         -Wall         -Wextra         -mfloat-abi=hard         -mfpu=fpv4-sp-d16         -ffunction-sections         -fdata-sections         -fno-strict-aliasing         -fno-builtin         -fshort-enums -g  -O0         -g0         -mcpu=cortex-m4         -mthumb         -mabi=aapcs         -mfloat-abi=hard         -mfpu=fpv4-sp-d16         -Wl,--gc-sections         --specs=nano.specs         --specs=nosys.specs -L/opt/nRF5_SDK_15.3.0_59ac345/modules/nrfx/mdk -T/home/ricardo/Git/cmake-arm-toolchain/linker.ld -lc -lnosys -lm CMakeFiles/main.dir/main.c.obj  -o main libsdk_lib.a 
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: warning: cannot find entry symbol Reset_Handler; defaulting to 0000000000000000
make[3]: Leaving directory '/home/ricardo/Git/cmake-arm-toolchain/cmake-build-debug'
[100%] Built target main

正在调用的链接器不是 arm-none-eabi-ld 而是工具链文件夹中的另一个链接器。因此,我开始考虑是否正确执行了链接过程,并且所有目标文件都在一个 elf 文件中构建。 我现在有点迷失在这个过程中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    相关资源
    最近更新 更多