【问题标题】:Cmake "ld.exe:cannot open linker script file"Cmake“ld.exe:无法打开链接器脚本文件”
【发布时间】:2018-02-01 18:13:22
【问题描述】:

我通过 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

File structure

Cmake 选项是:

Cmake options

当我重新加载这个项目时,它并不顺利。

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的路径不是我设置的路径?

【问题讨论】:

  • 有同样的问题。你解决过这个问题吗?

标签: c cmake linker cross-compiling stm32


【解决方案1】:

我使用的是 Linux,但我遇到了类似的问题,无法打开链接描述文件。

cannot open linker script file 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: 前缀被删除,选项字符串的其余部分使用单独的参数() 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})

【讨论】:

    【解决方案2】:

    改变这个: 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}")

    【讨论】:

    • 您的回答将受益于解释。
    • 是不是因为 CMAKE_EXE_LINKER_FLAGS 包含的标志比存储在 CMAKE_EXE_LINKER_FLAGS_INIT 中的默认标志多?
    • 去掉“T”和链接器文件名之间的空格
    猜你喜欢
    • 1970-01-01
    • 2016-08-15
    • 2014-08-19
    • 2021-11-24
    • 1970-01-01
    • 2010-11-04
    • 2011-12-01
    • 2016-05-29
    • 1970-01-01
    相关资源
    最近更新 更多