CMake“ld.exe:无法打开链接器脚本文件”

3

我使用STMCubeMX生成了一个项目,并想把这个项目导入到Clion中。

下面是CmakeList.txt文件:

project(ClionTest)
cmake_minimum_required(VERSION 3.8)

add_definitions(-DSTM32F4xx)

file(GLOB_RECURSE USER_SOURCES "Src/*.c")
file(GLOB_RECURSE HAL_SOURCES "Drivers/STM32F4xx_HAL_Driver/Src/*.c")

add_library(CMSIS
        startup/startup_stm32f407xx.s)

include_directories(Drivers/CMSIS/Device)
include_directories(Drivers/CMSIS/Device/ST/STM32F4xx/Include)
include_directories(Drivers/CMSIS/Include)
include_directories(Drivers/STM32F4xx_HAL_Driver)
include_directories(Drivers/STM32F4xx_HAL_Driver/Inc)
include_directories(Inc)
include_directories(Middlewares/Third_Party/LwIP/src/include)

add_executable(${PROJECT_NAME}.elf ${USER_SOURCES} ${HAL_SOURCES} ${LINKER_SCRIPT})

target_link_libraries(${PROJECT_NAME}.elf CMSIS)

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Map=${PROJECT_SOURCE_DIR}/build/${PROJECT_NAME}.map")
set(HEX_FILE ${PROJECT_SOURCE_DIR}/build/${PROJECT_NAME}.hex)
set(BIN_FILE ${PROJECT_SOURCE_DIR}/build/${PROJECT_NAME}.bin)
add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
        COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_FILE}
        COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_FILE}
        COMMENT "Building ${HEX_FILE} \nBuilding ${BIN_FILE}")

以下是一个 STM32F4xx.cmake 文件:

INCLUDE(CMakeForceCompiler)

SET(CMAKE_SYSTEM_NAME Generic)
SET(CMAKE_SYSTEM_VERSION 1)

# specify the cross compiler
#CMAKE_FORCE_C_COMPILER(C:/Program Files (x86)/GNU Tools ARM Embedded/6 2017-q2-update/bin/arm-none-eabi-gcc.exe GNU)
#CMAKE_FORCE_CXX_COMPILER(D:/Lib/arm/bin/arm-none-eabi-g++.exe GNU)

SET(CMAKE_C_COMPILER "C:/Program Files (x86)/GNU Tools ARM Embedded/6 2017-q2-update/bin/arm-none-eabi-gcc.exe")
SET(CMAKE_CXX_COMPILER "C:/Program Files (x86)/GNU Tools ARM Embedded/6 2017-q2-update/bin/arm-none-eabi-g++.exe")

SET(LINKER_SCRIPT ${PROJECT_SOURCE_DIR}/STM32F407VETx_FLASH.ld)
#Uncomment for software floating point
#SET(COMMON_FLAGS "-mcpu=cortex-m4 -mthumb -mthumb-interwork -mfloat-abi=soft -ffunction-sections -fdata-sections -g -fno-common -fmessage-length=0")
SET(COMMON_FLAGS "-mcpu=cortex-m4 -mthumb -mthumb-interwork -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffunction-sections -fdata-sections -g -fno-common -fmessage-length=0")
SET(CMAKE_CXX_FLAGS_INIT "${COMMON_FLAGS} -std=c++11")
SET(CMAKE_C_FLAGS_INIT "${COMMON_FLAGS} -std=gnu99")
SET(CMAKE_EXE_LINKER_FLAGS_INIT "-Wl,-gc-sections,-M=binary.map -T ${LINKER_SCRIPT}")

我设置了LINKER_SCRIPT ${PROJECT_SOURCE_DIR}/STM32F407VETx_FLASH.ld

文件结构

Cmake选项如下:

Cmake选项

当我重新加载这个项目时,它并不能很好地进行。

c:/progra~2/gnutoo~1/62017-~1/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/bin/ld.exe: cannot open linker script file
D:/Project/ClionTest/cmake-build-default/CMakeFiles/CMakeTmp/STM32F407VETx_FLASH.ld:
  Invalid argument

  collect2.exe: error: ld returned 1 exit status

  CMakeFiles\cmTC_bf7b4.dir\build.make:96: recipe for target 'cmTC_bf7b4' failed

  mingw32-make.exe[1]: *** [cmTC_bf7b4] Error 1

  mingw32-make.exe[1]: Leaving directory
  'D:/Project/ClionTest/cmake-build-default/CMakeFiles/CMakeTmp'

  Makefile:125: recipe for target 'cmTC_bf7b4/fast' failed

  mingw32-make.exe: *** [cmTC_bf7b4/fast] Error 2

似乎 ld.exe 的路径不正确,我应该如何设置它的路径?为什么搜索到的 STM32F407VETx_FLASH.ld 的路径不是我设置的路径?

你遇到了同样的问题吗?你解决了吗? - polwel
2个回答

1

我正在使用Linux,但是我遇到了类似的问题,无法打开链接脚本。

无法打开链接器脚本文件D:/Project/ClionTest/cmake-build-default/CMakeFiles/CMakeTmp/STM32F407VETx_FLASH.ld

在查看target_link_option文档一段时间后(它执行与直接设置变量大致相同的操作),我注意到了SHELL:指令,该指令说明如下:

选项集被去重以避免重复。虽然对于单个选项有益,但去重步骤可能会破坏选项组。例如,-D A -D B变成-D A B。可以使用类似shell的引号和SHELL:前缀来指定一组选项。 SHELL:前缀被删除,选项字符串的其余部分使用separate_arguments()UNIX_COMMAND模式解析。

通过将其添加到我的命令中,我成功使编译正常工作。结果如下:

set(LINKER_SCRIPT "${CMAKE_SOURCE_DIR}/STM32F303CCTX_FLASH.ld")
set(LINKER_FLAGS "SHELL:-T${LINKER_SCRIPT} -Wl,--gc-sections --specs=nano.specs --specs=nosys.specs")
target_link_options(${PROJECT_BINARY} PRIVATE ${LINKER_FLAGS})

-1
将以下代码从: SET(CMAKE_EXE_LINKER_FLAGS_INIT "-Wl,-gc-sections,-M=binary.map -T ${LINKER_SCRIPT}") 改为: SET(CMAKE_EXE_LINKER_FLAGS "-Wl,-gc-sections,-M=binary.map -T${LINKER_SCRIPT}")

1
你的回答如果附带解释会更有帮助。 - O.O.Balance
这是因为CMAKE_EXE_LINKER_FLAGS包含的标志比存储在CMAKE_EXE_LINKER_FLAGS_INIT中的默认标志多吗? - Jerry Jeremiah
将“T”和链接器文件名之间的空格去掉。 - Marjon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接