首页 > 解决方案 > 如何使用 cmake 生成 .out 文件?

问题描述

我正在使用 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”文件。

如何在不使用与主构建并行的另一个自定义命令的情况下生成它?

PS:这里是项目的当前状态https://github.com/NunoRVicente/cmake-arm-toolchain

标签: cmakecmake-language

解决方案


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

现在这里的问题是要理解为什么精灵被打破了,它正在超越我的知识。我已经使用 SDK 代码将sdk_lib 构建为 STATIC,并包含了头文件所在的目录。我添加了可执行文件并将 main 与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 文件中构建。我现在有点迷失在这个过程中。


推荐阅读