如何解决如何清除链接器错误? windows上交叉编译stm32
我正在尝试交叉编译一个简单的 c/cpp 文件,目标是 stm32f030F4P,我成功地设置了 CMake 文件,并且 cmake 成功地为 ninja 构建了 build.ninja 文件。 当我执行 ninja 时出现以下错误
PS C:\Users\varun\Desktop\Projects\stm32f030f4p\Firmware\Blinky\build>
ninja.exe [1/1] 链接 CXX 可执行文件 .elf 失败:.elf cmd.exe /C
"cd . && C:\DEV-TO~1\TOOLCH~1\GCC-AR~1\102020~1\bin\AR10B2~1.EXE
-march=armv6-m -mcpu=cortex-m0 -mthumb -DSTM32F030x4 -Og -ggdb -Wall -Wextra -ffunction-sections -fdata-sections -ffreestanding -fno-builtin --specs=nano.specs -fno-rtti - fno-exceptions -Wno-volatile -std=c++1z -g CMakeFiles/.elf.dir/src/main.cpp.obj -o .elf && cd 。”
c:/dev-to~1/toolch~1/gcc-ar~1/102020~1/bin/../lib/gcc/arm-none-eabi/10.2.1/../../.. /../arm-none-eabi/bin/ld.exe:
c:/dev-to~1/toolch~1/gcc-ar~1/102020~1/bin/../lib/gcc/arm-none-eabi/10.2.1/../../.. /../arm-none-eabi/lib/thumb/v6-m/nofp\libg_nano.a(lib_a-exit.o):
在函数 exit': exit.c:(.text.exit+0x1e): undefined reference to
_exit' collect2.exe 中:错误:ld 返回 1 退出状态忍者:构建
停止:子命令失败。附注
请找到我的 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")
FILE(GLOB_RECURSE
LDSCRIPTS
"ldscripts/*.ld"
)
FOREACH(file ${LDSCRIPTS})
SET(CMAKE_CAMKE_LINKER_FLAGS "${CAMKE_LINKER_FLAGS} -T \"${file}\" ")
ENDFOREACH()
#Setup project headers
INCLUDE_DIRECTORIES(
)
#Setup porject sources
FILE(GLOB_RECURSE
APPLICATION_SOURCE
"src/*.c"
"src/*.cpp"
)
ADD_EXECUTABLE(${PROJECT}.elf ${APPLICATION_SOURCE})
请找到我的 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 -ffreestanding -fno-builtin --specs=nano.specs")
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(CAMKE_LINKER_FLAGS "${CMAKE_COMMON_FLAGS} -nostartfiles -Wl,-Map,\"${TARGET}.map\" --specs-nano.specs")
我的链接脚本是从 STM32CubeIDE 复制粘贴的
> /* Entry Point */ ENTRY(Reset_Handler)
>
> /* Highest address of the user mode stack */
> _estack = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */
>
> _Min_Heap_Size = 0x200 ; /* required amount of heap */
> _Min_Stack_Size = 0x400 ; /* required amount of stack */
>
> /* Memories definition */ MEMORY { RAM (xrw) : ORIGIN =
> 0x20000000,LENGTH = 4K FLASH (rx) : ORIGIN = 0x8000000,> LENGTH = 16K }
>
> /* Sections */ SECTIONS { /* The startup code into "FLASH" Rom type
> memory */ .isr_vector : {
> . = ALIGN(4);
> KEEP(*(.isr_vector)) /* Startup code */
> . = ALIGN(4); } >FLASH
>
> /* The program code and other data into "FLASH" Rom type memory */
> .text : {
> . = ALIGN(4);
> *(.text) /* .text sections (code) */
> *(.text*) /* .text* sections (code) */
> *(.glue_7) /* glue arm to thumb code */
> *(.glue_7t) /* glue thumb to arm code */
> *(.eh_frame)
>
> KEEP (*(.init))
> KEEP (*(.fini))
>
> . = ALIGN(4);
> _etext = .; /* define a global symbols at end of code */ } >FLASH
>
> /* Constant data into "FLASH" Rom type memory */ .rodata : {
> . = ALIGN(4);
> *(.rodata) /* .rodata sections (constants,strings,etc.) */
> *(.rodata*) /* .rodata* sections (constants,etc.) */
> . = ALIGN(4); } >FLASH
>
> .ARM.extab : {
> . = ALIGN(4);
> *(.ARM.extab* .gnu.linkonce.armextab.*)
> . = ALIGN(4); } >FLASH
>
> .ARM : {
> . = ALIGN(4);
> __exidx_start = .;
> *(.ARM.exidx*)
> __exidx_end = .;
> . = ALIGN(4); } >FLASH
>
> .preinit_array : {
> . = ALIGN(4);
> PROVIDE_HIDDEN (__preinit_array_start = .);
> KEEP (*(.preinit_array*))
> PROVIDE_HIDDEN (__preinit_array_end = .);
> . = ALIGN(4); } >FLASH
>
> .init_array : {
> . = ALIGN(4);
> PROVIDE_HIDDEN (__init_array_start = .);
> KEEP (*(SORT(.init_array.*)))
> KEEP (*(.init_array*))
> PROVIDE_HIDDEN (__init_array_end = .);
> . = ALIGN(4); } >FLASH
>
> .fini_array : {
> . = ALIGN(4);
> PROVIDE_HIDDEN (__fini_array_start = .);
> KEEP (*(SORT(.fini_array.*)))
> KEEP (*(.fini_array*))
> PROVIDE_HIDDEN (__fini_array_end = .);
> . = ALIGN(4); } >FLASH
>
> /* Used by the startup to initialize data */ _sidata =
> LOADADDR(.data);
>
> /* Initialized data sections into "RAM" Ram type memory */ .data :
> {
> . = ALIGN(4);
> _sdata = .; /* create a global symbol at data start */
> *(.data) /* .data sections */
> *(.data*) /* .data* sections */
> *(.RamFunc) /* .RamFunc sections */
> *(.RamFunc*) /* .RamFunc* sections */
>
> . = ALIGN(4);
> _edata = .; /* define a global symbol at data end */
>
> } >RAM AT> FLASH
>
> /* Uninitialized data section into "RAM" Ram type memory */ . =
> ALIGN(4); .bss : {
> /* This is used by the startup in order to initialize the .bss section */
> _sbss = .; /* define a global symbol at bss start */
> __bss_start__ = _sbss;
> *(.bss)
> *(.bss*)
> *(COMMON)
>
> . = ALIGN(4);
> _ebss = .; /* define a global symbol at bss end */
> __bss_end__ = _ebss; } >RAM
>
> /* User_heap_stack section,used to check that there is enough "RAM"
> Ram type memory left */ ._user_heap_stack : {
> . = ALIGN(8);
> PROVIDE ( end = . );
> PROVIDE ( _end = . );
> . = . + _Min_Heap_Size;
> . = . + _Min_Stack_Size;
> . = ALIGN(8); } >RAM
>
> /* Remove information from the compiler libraries */ /DISCARD/ :
> {
> libc.a ( * )
> libm.a ( * )
> libgcc.a ( * ) }
>
> .ARM.attributes 0 : { *(.ARM.attributes) } }
最后c文件很简单
unsigned int counter;
int main(void)
{
for(;;)
{
counter++;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。