如何使用cmake生成Map文件

问题描述 投票:0回答:2

我正在尝试交叉编译,主机是 windows 目标是 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
2个回答
0
投票

(我相信一般指导是每个发布的问题一个问题)

答案:

当我运行 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
是否会发生冲突,但我修改了它以减少未来维护者的歧义。


0
投票

对于另一个问题,你应该这样做......

add_executable(foo ...)

target_link_options(foo
  PUBLIC
    LINKER:-Map=foo.map
)

这在

Handling Compiler Driver Differences
here.

部分讨论
© www.soinside.com 2019 - 2024. All rights reserved.