2014-04-15 1 views
2

Linux 64 비트 시스템에서 C로 hello world 프로그램을 컴파일하려고합니다. ARM 응용 프로그램을 ARM 프로세서에로드하기 위해 ARM 크로스 컴파일러를 사용하고 있습니다. 내가 수행하여 컴파일 할 때arm-none-eabi-gcc로 hello world 프로그램 C 컴파일시 오류가 발생했습니다.

/home/dico/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/lib/libc.a(lib_a-exit.o): In function exit': exit.c:(.text.exit+0x2c): undefined reference to _exit' /home/dico/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/lib/libc.a(lib_a-sbrkr.o): In function _sbrk_r': sbrkr.c:(.text._sbrk_r+0x18): undefined reference to _sbrk' /home/dico/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/lib/libc.a(lib_a-writer.o): In function _write_r': writer.c:(.text._write_r+0x20): undefined reference to _write' /home/dico/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/lib/libc.a(lib_a-closer.o): In function _close_r': closer.c:(.text._close_r+0x18): undefined reference to _close' /home/dico/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/lib/libc.a(lib_a-fstatr.o): In function _fstat_r': fstatr.c:(.text._fstat_r+0x1c): undefined reference to _fstat' /home/dico/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/lib/libc.a(lib_a-isattyr.o): In function _isatty_r': isattyr.c:(.text._isatty_r+0x18): undefined reference to _isatty' /home/dico/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/lib/libc.a(lib_a-lseekr.o): In function _lseek_r': lseekr.c:(.text._lseek_r+0x20): undefined reference to _lseek' /home/dico/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/lib/libc.a(lib_a-readr.o): In function _read_r': readr.c:(.text._read_r+0x20): undefined reference to _read' collect2: error: ld returned 1 exit status

: arm-none-eabi-gcc -o hello hello.c를 사용하여 코드를 컴파일 할 때 그러나, 나는 오류의 시리즈를 얻을 arm-none-eabi-gcc -c hello.c를, 그것은 컴파일러가 잘 실행 하더군요 오브젝트 코드 hello.o을 만듭니다.

누군가 내 컴파일이 왜 그러한 오류를 반환하는지 알려주시겠습니까?

UPDATE 나는 C 런타임 라이브러리가 컴파일에 포함되지 않는다는 것을 지금 실현

. 컴파일러에 포함해야 할 옵션이나 printf와 같은 표준 함수를 사용할 수 있도록 라이브러리를 링크하는 방법을 아는 사람이 있습니까?

+0

보기 http://embdev.net/topic/129753 –

+1

이것은 도움이 될 수 있습니다. http://stackoverflow.com/questions/13235748/linker-error-on-ac-project-using-eclipse –

+0

libc 로우 레벨 함수. 그것은 플랫폼에 의존하기 때문에 arm-none-eabi-gcc 툴체인은 그것을 가지지 않을 것입니다. 일반적으로 칩 제조업체가 제공합니다. 대상 플랫폼이 무엇입니까? ** ** libc 함수 사용을 중단하면 (printf, malloc, open 등) 프로그램을 컴파일 할 수 있습니다. –

답변

1

콘솔이 없기 때문에 MCU 칩은 printf 문자열로 무엇을해야합니까? 그게 무슨 일이야. libc는 플랫폼에 종속적이고 libc에 포함되지 않는 저수준 함수를 필요로합니다.

이러한 모든 누락 된 기호를 정의하는 retarget.c 또는 syscalls.c 파일이 필요하며 칩 외부에서 액세스 할 수있는 직렬 회선으로 printf 출력을 적절히 조정하십시오.

yagarto 툴킷을 사용하는 것이 가장 좋습니다.이 도구 키트는 syscall.c 파일을 libc에 링크 할 때 프로젝트를 빌드하는 데 필요한 파일을 제공합니다.

짧은 경로를 시도하려면 syscall.c 파일을 프로젝트에 포함하고 필요에 맞게 내부 기능을 다시 프로그래밍하십시오.

마이크로 컨트롤러 세계에서 libc에 대한 베어 글 gcc toolchain을 연결하는 것은 초보자가 아닙니다. 내 추천은 항상 단계별 yagarto 튜토리얼을 따라 가야합니다.

+1

도움을 주셔서 감사합니다. 이 안녕하세요 세계 프로그램과 따라서 인쇄의 사용은 내 프로젝트에서 나중에 사용하기 위해 툴체인을 테스트하는 것입니다. 일단 잘 작동되면, 표준 함수를 더 이상 사용하지 않고 표준 라이브러리 (uIP)를 사용할 것입니다. 하지만 syscall.c 링크가 작동하지 않습니다. – Adam