cmake - 如何使用 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
解决方案
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 文件中构建。我现在有点迷失在这个过程中。
推荐阅读
- javascript - 如何使用嵌套在数组中的另一个对象的数据更新一个对象?
- html - 当行以空格开头时如何防止自动预格式化
- python - 如何修复这个 Django HTML 模板错误?
- sql - 查询以检查在 oracle 中的表上完成的最后 DML 的日期和时间
- linux - 使用 find 定位不属于 USER 或 GROUP 的文件
- sql - ORACLE:用于提取每个类别的最后进入日期的 SQL 查询
- eclipse - 从 Eclipse 停止执行 selenium 测试
- arrays - 在rails上添加到数组ruby时得到错误的输出
- docker - Docker、rabbitMQ 和 pike 连接被拒绝
- javascript - 使用库 react-cytoscape.js 进行一些拖动操作后如何重置为初始坐标