我正在尝试交叉编译,主机是 windows 目标是 stm32(arm)。我正在尝试从 arm-none-eabi-ld 生成一个映射文件。 我的问题是双重的
请在下面找到我的工具链 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)
(我相信一般指导是每个发布的问题一个问题)
答案:
的文档当我运行 build clean 时,我的 .hex 文件和 .bin 文件没有被删除。
目标没有输出文件
没有输出文件意味着 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
是否会发生冲突,但我修改了它以减少未来维护者的歧义。
对于另一个问题,你应该这样做......
add_executable(foo ...)
target_link_options(foo
PUBLIC
LINKER:-Map=foo.map
)
这在
Handling Compiler Driver Differences
here.部分讨论