2013-01-10 3 views
1

Eclipse을 사용하여 ARM 프로세서 용 g ++ 프로젝트를 크로스 컴파일합니다. 나는 Windows 환경에서 yagarto toolchain을 사용하고 있습니다. 나는 C 프로젝트와 아무런 문제가 없지만, C++에서 나는 오류를 수신 계속 :크로스 g ++ 컴파일러 링커 오류

libc.a(lib_a-abort.o): In function `abort': 
abort.c:63: undefined reference to `_exit' 

libc.a(lib_a-sbrkr.o): In function `_sbrk_r': 
sbrkr.c:58 undefined reference to `_sbrk' 

libc.a(lib_a-signalr.o): In function `_kill_r': 
signalr.c:61: undefined reference to `_kill' 

뿐만 아니라 :

undefined reference to `_getpid' 
undefined reference to `_write' 
undefined reference to `_close' 
undefined reference to `_fstat' 
undefined reference to `_isatty' 
undefined reference to `_lseek' 
undefined reference to `_read' 

보고에서 나는 링커 문제가있을 것 같습니다 주위에. 나는 링커 flash.ld를 추가하려고 시도했다. Atmel Studio의 내 ARM 개발 키트 용 GCC 예제입니다. 그것은 도움이되지 않습니다. 거기에 g ++을위한 링커가 있나요? 다른 문제가 있습니까? 나는 소스 파일하여 Main.cpp, HALTimer1.cpp와 헤더 파일 Haltimer.h이

make all 
Building target: Foo 
Invoking: Cross G++ Linker 
arm-none-eabi-g++ -nostartfiles -T C:/Users/kempsa/eclipse_workspace/Foo/flash.ld -o"Foo" ./HALTimer1.o ./Main.o 

: 여기

내 빌드 옵션입니다. 주 파일에는 헤더 파일 만 포함됩니다. 헤더 파일은 HALTimer 클래스를 하나의 변수로 정의합니다. 나는 이것들이 오류에 영향을 미친다고 믿지 않는다. 난 오류가 전적으로 올바른 링커 파일없이 g ++ 프로젝트를 만들려는 것이라고 믿습니다. 여기

링커 파일의 내용이다 :

/** 
* \file 
* 
* \brief Flash Linker script for SAM. 
* 
* Copyright (c) 2011-2012 Atmel Corporation. All rights reserved. 
* 


    OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") 
    OUTPUT_ARCH(arm) 
    SEARCH_DIR(.) 

    /* Memory Spaces Definitions */ 
    MEMORY 
    { 
     rom (rx) : ORIGIN = 0x00400000, LENGTH = 0x00040000 /* flash has two banks, one bank = 256K */ 
    ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00010000 /* sram, 64K */ 
    } 

    /* The stack size used by the application. NOTE: you need to adjust */ 
    __stack_size__ = DEFINED(__stack_size__) ? __stack_size__ : 0x2000; 

    /* Section Definitions */ 
    SECTIONS 
    { 
     .text : 
     { 
      . = ALIGN(4); 
      _sfixed = .; 
      KEEP(*(.vectors .vectors.*)) 
      *(.text .text.* .gnu.linkonce.t.*) 
     *(.glue_7t) *(.glue_7) 
     *(.rodata .rodata* .gnu.linkonce.r.*) 
     *(.ARM.extab* .gnu.linkonce.armextab.*) 

     /* Support C constructors, and C destructors in both user code 
      and the C library. This also provides support for C++ code. */ 
     . = ALIGN(4); 
     KEEP(*(.init)) 
     . = ALIGN(4); 
     __preinit_array_start = .; 
     KEEP (*(.preinit_array)) 
     __preinit_array_end = .; 

     . = ALIGN(4); 
     __init_array_start = .; 
     KEEP (*(SORT(.init_array.*))) 
     KEEP (*(.init_array)) 
     __init_array_end = .; 

     . = ALIGN(0x4); 
     KEEP (*crtbegin.o(.ctors)) 
     KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) 
     KEEP (*(SORT(.ctors.*))) 
     KEEP (*crtend.o(.ctors)) 

     . = ALIGN(4); 
     KEEP(*(.fini)) 

     . = ALIGN(4); 
     __fini_array_start = .; 
     KEEP (*(.fini_array)) 
     KEEP (*(SORT(.fini_array.*))) 
     __fini_array_end = .; 

     KEEP (*crtbegin.o(.dtors)) 
     KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) 
     KEEP (*(SORT(.dtors.*))) 
     KEEP (*crtend.o(.dtors)) 

     . = ALIGN(4); 
     _efixed = .;   /* End of text section */ 
    } > rom 

    /* .ARM.exidx is sorted, so has to go in its own output section. */ 
    PROVIDE_HIDDEN (__exidx_start = .); 
    .ARM.exidx : 
    { 
     *(.ARM.exidx* .gnu.linkonce.armexidx.*) 
    } > rom 
    PROVIDE_HIDDEN (__exidx_end = .); 

    . = ALIGN(4); 
    _etext = .; 

    .relocate : AT (_etext) 
    { 
     . = ALIGN(4); 
     _srelocate = .; 
     *(.ramfunc .ramfunc.*); 
     *(.data .data.*); 
     . = ALIGN(4); 
     _erelocate = .; 
    } > ram 

    /* .bss section which is used for uninitialized data */ 
    .bss (NOLOAD) : 
    { 
     . = ALIGN(4); 
     _sbss = . ; 
     _szero = .; 
     *(.bss .bss.*) 
     *(COMMON) 
     . = ALIGN(4); 
     _ebss = . ; 
     _ezero = .; 
    } > ram 

    /* stack section */ 
    .stack (NOLOAD): 
    { 
     . = ALIGN(8); 
      _sstack = .; 
     . = . + __stack_size__; 
     . = ALIGN(8); 
     _estack = .; 
    } > ram 

    . = ALIGN(4); 
    _end = . ; 
} 

전체 컴파일러 출력 :

Building target: Foo 
Invoking: Cross G++ Linker 
arm-none-eabi-g++ -nostartfiles -T C:/Users/kempsa/eclipse_workspace/Foo/flash.ld -o"Foo"  ./HALTimer.o ./Main.o 
c:/yagarto/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib\libc.a(lib_a-abort.o): In function `abort': 
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\stdlib/../../../../../newlib-1.20.0/newlib/libc/stdlib/abort.c:63: undefined reference to `_exit' 
c:/yagarto/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib\libc.a(lib_a-sbrkr.o): In function `_sbrk_r': 
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/../../../../../newlib-1.20.0/newlib/libc/reent/sbrkr.c:58: undefined reference to `_sbrk' 
c:/yagarto/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib\libc.a(lib_a-signalr.o): In function `_kill_r': 
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/../../../../../newlib-1.20.0/newlib/libc/reent/signalr.c:61: undefined reference to `_kill' 
c:/yagarto/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib\libc.a(lib_a-signalr.o): In function `_getpid_r': 
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/../../../../../newlib-1.20.0/newlib/libc/reent/signalr.c:96: undefined reference to `_getpid' 
c:/yagarto/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib\libc.a(lib_a-writer.o): In function `_write_r': 
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/../../../../../newlib-1.20.0/newlib/libc/reent/writer.c:58: undefined reference to `_write' 
c:/yagarto/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib\libc.a(lib_a-closer.o): In function `_close_r': 
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/../../../../../newlib-1.20.0/newlib/libc/reent/closer.c:53: undefined reference to `_close' 
c:/yagarto/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib\libc.a(lib_a-fstatr.o): In function `_fstat_r': 
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/../../../../../newlib-1.20.0/newlib/libc/reent/fstatr.c:62: undefined reference to `_fstat' 
c:/yagarto/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib\libc.a(lib_a-isattyr.o): In function `_isatty_r': 
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/../../../../../newlib-1.20.0/newlib/libc/reent/isattyr.c:58: undefined reference to `_isatty' 
c:/yagarto/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib\libc.a(lib_a-lseekr.o): In function `_lseek_r': 
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/../../../../../newlib-1.20.0/newlib/libc/reent/lseekr.c:58: undefined reference to `_lseek' 
c:/yagarto/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib\libc.a(lib_a-readr.o): In function `_read_r': 
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\reent/../../../../../newlib-1.20.0/newlib/libc/reent/readr.c:58: undefined reference to `_read' 
collect2.exe: error: ld returned 1 exit status 
make: *** [Foo] Error 1 
+0

링커 파일 문제라고 생각되면'C :/Users/kempsa/eclipse_workspace/Foo/flash.ld' 링커 명령 파일의 내용을 나열하십시오. – phonetagger

+1

gcc와 g ++ 모두에서'-v' 옵션을 사용해보십시오. 차이점을 살펴보십시오. –

+0

함께 연결하려는 객체와 라이브러리가'objdump -af * .o * .a '로 검사하여 동일한 아키텍처를 사용하는지 확인하십시오. –

답변

0

, 링커 옵션 -Wl 추가 - GC-섹션과 문제가

를 해결해야한다
+0

답변으로 게시해서는 안되며 질문에 포함 시키십시오. 이제 그 일을 끝내 셨습니다. – ChrisWue