首页 文章

使用arm-none-eabi-gcc编译hello world程序C时出错

提问于
浏览
2

我试图在Linux 64位机器上用C编译一个hello world程序 . 我正在使用ARM交叉编译器将我的应用程序加载到ARM处理器上 . 但是,当使用 arm-none-eabi-gcc -o hello hello.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):在函数exit':exit.c :( . text.exit 0x2c):undefined reference to_exit'/ home / dico / gcc-arm-none- EABI-4_7-2013q3 / bin中/../ LIB / GCC /臂-NONE-EABI / 4.7.4 /../../../../臂-NONE-EABI / LIB /的libc.a(lib_a -sbrkr.o):在函数_sbrk_r'中:sbrkr.c :( . text._sbrk_r 0x18):未定义引用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):在函数_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):在函数_close_r'中:closer.c :( . text._close_r 0x18):undefined参考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):在函数_fstat_r'中:fstatr.c :( . text._fstat_r 0x1c):未定义的引用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):在函数_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):在函数_lseek_r'中:lseekr.c :( . text._lseek_r 0x20):未定义引用to_lseek'/ home / dico / gcc-arm-none- EABI-4_7-2013q3 / bin中/../ LIB / GCC /臂-NONE-EABI / 4.7.4 /../../../../臂-NONE-EABI / LIB /的libc.a(lib_a -readr.o):在函数_read_r'中:readr.c :( . text._read_r 0x20):undefined reference to_read'colle2:error:ld返回1退出状态

当我尝试编译: arm-none-eabi-gcc -c hello.c 时,它会创建一个目标代码 hello.o ,告诉我编译器运行正常 .

有人可能会告诉我为什么我的编译会返回这样的错误吗?

UPDATE

我现在意识到C运行时库不包含在编译中 . 有没有人知道我需要在编译中包含的任何选项,或者如何链接库以便能够使用标准函数,例如printf?

1 回答

  • 1

    由于没有控制台,MCU芯片应该如何处理printf字符串?这就是发生的事情 . libc需要与平台相关的低级函数,不应包含在libc中 .

    您需要一个retarget.c或一个syscalls.c文件来定义所有这些缺失的符号,并将printf输出正确地重新定位到您可以从芯片外部访问的串行线 .

    我强烈建议您使用yagarto工具包,它们提供了一个syscall.c文件,其中包含了在与libc链接时构建项目所需的内容,就像您正在做的那样 .

    如果您想尝试短路径,请在项目中包含syscall.c文件,并重新编程其功能内部以满足您的需求 .

    在微控制器世界中将裸gcc工具链与libc链接不适合初学者 . 我的建议总是按照一步一步的yagarto教程进行 .

相关问题