0

我目前正在使用avr-gcc编译器在 Atmel ATMega328p 微控制器上运行一个嵌入式项目。我决定使用 CMake 来创建我的构建系统,因为这样可以很容易地使用 Intellisense 将我的项目集成到 VS Code 中。

我想在我的项目中设置的设置之一是输出 *.map 文件以在编译完成后查看内存映射,以及每个编译对象和最终二进制文件的 *.lst 文件。我已经通过添加-Wl,-Map=${CMAKE_PROJECT_NAME}.mapCMAKE_EXE_LINKER_FLAGS. 我还通过添加-Wa,-anhlmsd=<OBJECT>.lstCMAKE_C_COMPILE_OBJECT.

我无法解决的问题是如何为最终二进制文件创建最终的 lst 文件,在本例中为“avr-bootloader.elf”。我已经投入-Wa,-adhlns=${CMAKE_PROJECT_NAME}.lstCMAKE_EXE_LINKER FLAGS忍者正在avr-gcc对预期位置的旗帜进行最后一次呼叫。我期待在 CMake 生成适当的 makefile 然后运行构建后在构建目录中找到“avr-bootloader.lst”,但我没有得到这样的文件。设置绝对路径并不能解决问题。删除等号并查看标准输出表明avr-gcc没有打印任何程序集列表。令我困惑的是地图文件的创建是如何毫无问题的。关于为什么这个 CMake 项目没有创建最终的程序集清单,我是否缺少任何细节?我查找的所有搜索都只提到了该功能的使用及其输出,而不是任何输出为空或不存在的情况。

CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)
project(avr-bootloader VERSION 0.1.0)

enable_language(C ASM)

set(mcu atmega328p)

set(CMAKE_EXE_LINKER_FLAGS -mmcu=${mcu})

add_compile_options(
    -mmcu=${mcu}
    -Os
    -g3
    -Wall
    -Wextra
    -Wdouble-promotion
    -Wno-main
    -Wstack-usage=255
    -Wconversion
)

set (src
    main.c)

# Output lst and map file
set(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -Wa,-adhlns=${CMAKE_PROJECT_NAME}.lst -Wl,-Map=${CMAKE_PROJECT_NAME}.map")
set(CMAKE_C_COMPILE_OBJECT "${CMAKE_C_COMPILE_OBJECT} -Wa,-anhlmsd=<OBJECT>.lst")



add_executable(avr-bootloader.elf ${src})
target_link_libraries(avr-bootloader.elf printf_min)
target_include_directories(avr-bootloader.elf PRIVATE .)
4

1 回答 1

0

经过进一步调查,似乎在 CMake 的最终调用期间未使用汇编程序选项,gcc并且我传递的任何参数都不会输出任何内容。因此,最好的选择是使用自定义命令avr-objdump在构建完成时调用。

add_custom_command(OUTPUT ${CMAKE_PROJECT_NAME}.lst
    MAIN_DEPENDENCY $<TARGET_FILE:${CMAKE_PROJECT_NAME}.elf>
    COMMAND ${CMAKE_OBJDUMP} -h -S $<TARGET_FILE:${CMAKE_PROJECT_NAME}.elf> > ${CMAKE_PROJECT_NAME}.lst
    COMMENT "Invoking: Cross AVR GNU Create Listing")
于 2022-02-24T23:12:06.927 回答