【问题标题】:How to generate Map file using cmake如何使用 cmake 生成地图文件
【发布时间】:2021-07-04 11:51:01
【问题描述】:

我正在尝试交叉编译,主机是 wondows,目标是 stm32(arm)。我正在尝试从 arm-none-eabi-ld 生成地图文件。 我的问题是双重的

  1. 我无法生成地图文件。这是我的主要问题。
  2. 当我运行 build clean 时,我的 .hex 文件和 .bin 文件没有被删除。

请在下面找到我的工具链 cmake 文件(arm-none-eabi.cmake)。

MESSAGE("Running : arm-none-eabi.cmake")

SET(CMAKE_SYSTEM_PROCESSOR  arm)
SET(CMAKE_SYSTEM_NAME       Generic)

SET(CMAKE_C_COMPILER_WORKS  TRUE)
SET(CMAKE_CXX_COMPILER_WORKS  TRUE)

SET(CMAKE_TRY_COMPILE_TARGTE_TYPE   STATIC_LIBRARY)

SET(TARGET      STM32F030x4)
SET(ARCH        armv6-m)
SET(CPU         cortex-m0)
SET(ARM_ISA     mthumb)

SET(CMAKE_C_COMPILER    arm-none-eabi-gcc)
SET(CMAKE_CXX_COMPILER  arm-none-eabi-g++)
SET(CMAKE_ASM_COMPILER  arm-none-eabi-g++)
SET(CMAKE_SIZE          arm-none-eabi-size)
SET(CMAKE_OBJDUMP       arm-none-eabi-objdump)
SET(CMAKE_OBJCOPY       arm-none-eabi-objcopy)

SET(OPTIMISATION Og)
SET(DEBUG "ggdb")

SET(CMAKE_COMMON_FLAGS  "-march=${ARCH} -mcpu=${CPU} -${ARM_ISA} -D${TARGET} -${OPTIMISATION} -${DEBUG} -Wall -Wextra -ffunction-sections -fdata-sections -nostdlib -ffreestanding -fno-builtin --specs=nosys.specs -lc --entry main")
SET(CMAKE_ASM_FLAGS     "${CMAKE_COMMON_FLAGS}")
SET(CMAKE_C_FLAGS       "${CMAKE_COMMON_FLAGS} ") #-std=gnull
SET(CMAKE_CXX_FLAGS     "${CMAKE_COMMON_FLAGS} -fno-rtti -fno-exceptions -Wno-volatile -std=c++1z")
SET(CMAKE_LINKER_FLAGS  "${CMAKE_COMMON_FLAGS} -nostartfiles -Wl,-Map,\"${TARGET}.map\"  --specs-nosys.specs")

-Wl,-Map,"${TARGET}.map" 命令没有生成地图文件。

我的 CmakeLists.txt 文件

CMAKE_MINIMUM_REQUIRED(VERSION 3.20)

INCLUDE("CMake/arm-none-eabi.cmake")

SET(CMAKE_C_STANDARD    11)
SET(CMAKE_CXX_STANDARD  17)



PROJECT(BLINKY VERSION 1.0.1 DESCRIPTION "Blinky Example")
MESSAGE("Building "${PROJECT_NAME})

FILE(GLOB_RECURSE
    LDSCRIPTS
    "ldscripts/*.ld"
)

FOREACH(file ${LDSCRIPTS})
    SET(CMAKE_LINKER_FLAGS "${CAMKE_LINKER_FLAGS} -T \"${file}\" ")
ENDFOREACH()

#Setup project headers
INCLUDE_DIRECTORIES(
    "Core/"
    "Drivers/"
)

#Setup porject sources
FILE(GLOB_RECURSE
    APPLICATION_SOURCE
    "Application/*.c"
    "Application/*.cpp"
    "Application/*.s"
    "Core/*.c"
    "Core/*cpp"
    "Core/*.s"
    "Drivers/*.c"
    "Drivers/*.cpp"
    "Drivers/*.s"
)

ADD_EXECUTABLE(${TARGET}.elf ${APPLICATION_SOURCE})
ADD_CUSTOM_TARGET(${TARGET}.bin ALL DEPENDS ${TARGET}.elf COMMAND ${CMAKE_OBJCOPY} -O binary ${TARGET}.elf ${TARGET}.bin)
ADD_CUSTOM_TARGET(${TARGET}.hex ALL DEPENDS ${TARGET}.elf COMMAND ${CMAKE_OBJCOPY} -O ihex ${TARGET}.elf ${TARGET}.hex)
ADD_CUSTOM_TARGET(SIZE ALL ${CMAKE_SIZE} ${TARGET}.elf DEPENDS ${TARGET}.elf)

【问题讨论】:

    标签: assembly cmake stm32 ld elf


    【解决方案1】:

    (我认为一般指导是每个已发布问题的一个问题/问题)

    回答:

    当我运行 build clean 时,我的 .hex 文件和 .bin 文件不会被删除。

    根据add_custom_target() 的文档:

    目标没有输出文件

    没有输出文件意味着 CMake 不知道它会产生什么。您可能想要做的是使用add_custom_command(),然后使自定义目标依赖于自定义命令:

    ADD_CUSTOM_COMMAND(OUTPUT ${TARGET}.bin DEPENDS ${TARGET}.elf COMMAND ${CMAKE_OBJCOPY} -O binary ${TARGET}.elf ${TARGET}.bin)
    ADD_CUSTOM_COMMAND(OUTPUT ${TARGET}.hex DEPENDS ${TARGET}.elf COMMAND ${CMAKE_OBJCOPY} -O ihex ${TARGET}.elf ${TARGET}.hex)
    ADD_CUSTOM_TARGET(${TARGET}_bin DEPENDS ${TARGET}.bin)
    ADD_CUSTOM_TARGET(${TARGET}_hex DEPENDS ${TARGET}.hex)
    

    我不确定${TARGET}.bin 是否会发生冲突,但我对其进行了修改以减少对未来维护者的歧义。

    【讨论】:

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