使用arm-none-eabi--gcc交叉编译时CMake工具链文件错误

时间:2020-04-23 18:56:19

标签: gcc cmake arm

我正在尝试为Windows上的STM32F407编写自己的CMake构建系统。以下是我的CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)

project(test_1 LANGUAGES C)

#Set the path if arm-none-eabi's bin folder is not added in the SYSTEM path environment variable

set(CMAKE_TOOLCHAIN_FILE "toolchain_stm32f407.cmake")

set_property(SOURCE startup_stm32f407xx.s PROPERTY LANGUAGE C)

set(INCLUDE_DIRECTORIES     ./inc)
include_directories(${INCLUDE_DIRECTORIES})

set(SOURCE_FILES        ./src/main.c)
add_executable(${CMAKE_PROJECT_NAME}.elf ${SOURCE_FILES})


add_custom_target(TARGET ${CMAKE_PROJECT_NAME}.elf POST_BUILD
    COMMAND ${CMAKE_SIZE} --format=berkeley "${CMAKE_PROJECT_NAME}.elf")

我有2个工具链文件。一个工作正常,另一个给我一个错误。 错误的工具链文件:

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR ARM)

option(LINUX OFF)

#Set the path if arm-none-eabi's bin folder is not added in the SYSTEM path environment variable
if(LINUX)
    set(ARM_TOOLCHAIN_PATH "./gcc-arm-none-eabi-9-2019-q4-major/bin")
else(LINUX)
    set(ARM_TOOLCHAIN_PATH "D:/gcc-arm-none-eabi-7-2018-q2-update/bin")
    set(EXE ".exe")
endif(LINUX)

set(LINKER_PATH "./STM32F407VGTx_FLASH.ld")

option(DEBUG ON)

set(CMAKE_C_COMPILER_WORKS ON)
set(CMAKE_CXX_COMPILER_WORKS ON)

set(CMAKE_C_COMPILER    ${ARM_TOOLCHAIN_PATH}/arm-none-eabi-gcc${EXE})
set(CMAKE_CXX_COMPILER  ${ARM_TOOLCHAIN_PATH}/arm-none-eabi-g++.exe${EXE})
set(CMAKE_ASM_COMPILER  ${ARM_TOOLCHAIN_PATH}/arm-none-eabi-as.exe${EXE})
set(CMAKE_OBJCOPY   ${ARM_TOOLCHAIN_PATH}/arm-none-eabi-objcopy${EXE})

if(DEBUG)
    set(DEBUG_FLAG "-g")
endif(DEBUG)

set(COMMON_FLAGS    "-mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mthumb-interwork ${DEBUG_FLAG} \
            -mcpu=cortex-m4 -march=armv7e-m \
            -Wall -fdata-sections -ffunction-section")
#Should these flags be added?: -Wall -Wextra -Wimplicit-function-declaration -Wredundant-decls -Wstrict-prototypes
#-Wundef -Wshadow
set(CMAKE_C_FLAGS       "${COMMON_FLAGS} -std=gnu99 --specs=nosys.specs")   
set(CMAKE_CXX_FLAGS     "${COMMON_FLAGS} -std=c++11 --specs=nosys.specs")
set(CMAKE_EXE_LINKER_FLAGS  "${COMMON_FLAGS} -Wl,-map=linker.map -Wl,--gc-sections" CACHE INTERNAL "")

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

错误:

>cmake -H. -B_build -DCMAKE_TOOLCHAIN_FILE:PATH="toolchain_stm3
2f407.cmake"
-- The C compiler identification is unknown
CMake Error at CMakeLists.txt:3 (project):
  The CMAKE_C_COMPILER:

    D:/gcc-arm-none-eabi-7-2018-q2-update/bin/arm-none-eabi-gcc.exe

  is not a full path and was not found in the PATH.

  Tell CMake where to find the compiler by setting either the environment
  variable "CC" or the CMake cache entry CMAKE_C_COMPILER to the full path to
  the compiler, or to the compiler name if it is in the PATH.


-- Configuring incomplete, errors occurred!

正确运行的工具链:(得到了以下问题的工具链文件:Link

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_C_COMPILER "arm-none-eabi-gcc.exe")
set(CMAKE_CXX_COMPILER "arm-none-eabi-g++.exe")

set(CMAKE_EXE_LINKER_FLAGS "--specs=nosys.specs" CACHE INTERNAL "")

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

我的问题是:

  1. 我无法理解导致该错误的错误工具链文件中缺少的内容。
  2. 在CMakeLists.txt中,我已将CMAKE_TOOLCHAIN_FILE设置为工具链文件。但是,除非我使用“ -DCMAKE_TOOLCHAIN_FILE:PATH =“将它作为CLI选项传递,否则不会检测到工具链文件。是什么原因造成的?
  3. 为什么只需要缓存CMAKE_EXE_LINKER_FLAGS?

谢谢

0 个答案:

没有答案