在使用Eclipse一个C项目链接错误(Linker error on a C project us

2019-07-03 14:19发布

我想创建的STM32F217IG微控制器的项目。

然后我安装Eclipse和GNU的ARM嵌入式GCC交叉编译器 。 我不认为这是代码的Sourcery之一。 我用它,因为它支持浮点和代码的Sourcery没有。

一旦我做到了,我想只有两个源文件中创建一个非常小的项目:test.c的和main.c中只写在两人面前:

#include <stdlib.h>
#include <stdio.h>

int main (void)
{
    printf("Hello, World!");
    return 0;
}

我在项目属性更改行命令通过臂无 - EABI - 海合会取代GCC,然后试图编译该项目。

我没有创建任何文件做出自己; 我曾经在Eclipse中自动创建。

该建筑似乎是很好,但是当涉及到我在控制台下面的错误链接:

make all
'Building target: test3'
'Invoking: Cross GCC Linker'
arm-none-eabi-gcc  -o"test3"  ./main.o ./test3.o

c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-exit.o): In function `exit':
exit.c:(.text.exit+0x2c): undefined reference to `_exit'

c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text._sbrk_r+0x18): undefined reference to `_sbrk'

c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-writer.o): In function `_write_r':
writer.c:(.text._write_r+0x20): undefined reference to `_write'

c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-closer.o): In function `_close_r':
closer.c:(.text._close_r+0x18): undefined reference to `_close'

c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-fstatr.o): In function `_fstat_r':
fstatr.c:(.text._fstat_r+0x1c): undefined reference to `_fstat'

c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-isattyr.o): In function `_isatty_r':
isattyr.c:(.text._isatty_r+0x18): undefined reference to `_isatty'

c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-lseekr.o): In function `_lseek_r':
lseekr.c:(.text._lseek_r+0x20): undefined reference to `_lseek'

c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../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: ld returned 1 exit status

make: *** [test3] Erreur 1

我看着在互联网上,我发现,它可能是一个系统调用的问题。 但我不知道我怎么这个库添加到我的Linux项目。

真的是这样吗? 如果是,如何解决呢? 如果不是,你在哪里是从何而来?

正如有人所说,我试过“链接” C运行时库。 在Eclipse上看来我有两个解决方案来做到这一点:

首先在项目属性→C / C ++→ 生成设置交联剂 。 我只是添加字母c ,然后错误不会改变,但-lc在命令行的末尾:

 make all
'Building target: test3'
'Invoking: Cross GCC Linker'
arm-none-eabi-gcc  -o"test3"  ./main.o ./test3.o   -lc

c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-exit.o): In function `exit':
exit.c:(.text.exit+0x2c): undefined reference to `_exit'

c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text._sbrk_r+0x18): undefined reference to `_sbrk'

c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-writer.o): In function `_write_r':
writer.c:(.text._write_r+0x20): undefined reference to `_write'

c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-closer.o): In function `_close_r':
closer.c:(.text._close_r+0x18): undefined reference to `_close'

c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-fstatr.o): In function `_fstat_r':
fstatr.c:(.text._fstat_r+0x1c): undefined reference to `_fstat'

c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-isattyr.o): In function `_isatty_r':
isattyr.c:(.text._isatty_r+0x18): undefined reference to `_isatty'

c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-lseekr.o): In function `_lseek_r':
lseekr.c:(.text._lseek_r+0x20): undefined reference to `_lseek'

c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../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: ld returned 1 exit status
make: *** [test3] Erreur 1

但我不知道是否真的意味着它添加的C运行时库。

第二,我在项目属性→C / C ++常规路径和符号 ,并在这里添加libc.a库是我得到了(完全不同的):

make all
'Building target: test3'
'Invoking: Cross GCC Linker'
arm-none-eabi-gcc  -o"test3"  ./main.o ./test3.o   -l"C:/Program\ Files/GNU\ Tools\ ARM\ Embedded/4.6\ 2012q4/arm-none-eabi/lib/armv7-m/libc.a"

c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/bin/ld.exe: cannot find -lC:/Program\ Files/GNU\ Tools\ ARM\ Embedded/4.6\ 2012q4/arm-none-eabi/lib/armv7-m/libc.a

collect2: ld returned 1 exit status
make: *** [test3] Erreur 1

然后,它仍然无法正常工作,但它搜索的好方法?

哦,一个非常有趣的事实:

我只是在调试模式下得到了错误。 如果我在释放模式一切都没有问题,而且我没有任何错误(除非我添加的libc.a话,我认为这不是做一件好事)。 这是否意味着问题出在.elf文件的创建?

Answer 1:

我看你链接的工具,只是读在下面readme.txt

这个工具链构建和用于Cortex-R / M裸机发展优化。

换句话说,这个工具链,具体用于为嵌入式系统,也许没有操作系统运行在所有。 在这种情况下,有没有系统,提供例如,标准输出,其中printf()应该写,没有文件系统,等等-你必须对一些链接库提供这些基本服务,如果你想使用它们。

这就是说,你的工具包提供librdimon.a它提供了所有这些基本服务库。 该库实际上是一部分libgloss汇编。 如果你想针对其链接,请尝试以下命令:

arm-none-eabi-gcc --specs=rdimon.specs   -Wl,--start-group -lgcc -lc -lm -lrdimon -Wl,--end-group -o test test.c

此链接罚款我的电脑上,而是它是否是你真正想要的是另一个故事(你在哪里希望看到printf()输出,反正?)。

对于你凑钱,你或许应该寻找被重定向标准输出到串行端口或JTAG调试提供输出的库。 或者,您可以使用自定义的功能,例如发送调试输出到串行控制台,而不是printf() -这取决于你。 如果您决定使用printf()我建议您阅读libgloss文档。

另外,我建议四处寻找这是专门为捆绑STM32系列工具链。 正确配置所有这些基本的东西(C库,链接脚本等)需要一点点的经验。

编辑:许多嵌入式系统并没有真正使用标准C库,从零开始漂亮多了。 如果你想要走这条路,你应该通过-nostdlibgcc调用。 当然,你将不再有这样的事情printf()提供。

编辑2:另一种方法是使用标准库( newlib ,我的意思),而不libgloss和东西你并不需要提供相应的存根。 你可能想跟随本教程 ,其中_read_write通过串行端口实现的,其他一切都存根。 这很可能是你真正想要的。



Answer 2:

我知道这是一个老问题,但试图建立一个STM32板时,我就遇到了这个今天。 这个项目我已经有一些链接脚本(特别是libs.ld)。 添加对该libnosys.a条目满足了链接,我才得以继续。

libs.ld:

 GROUP(
   libgcc.a
   libg.a
   libc.a
   libm.a
   libnosys.a
 )


Answer 3:

保存你的C程序为“myprint.c”,我编译如下:

臂-NONE-EABI-GCC myprint.c -lc -specs = nosys.specs

没有错误和输出是罚款。



Answer 4:

还有就是这样的问题malloc()free()在Eclipse项目函数调用。 我已经写固件使用Eclipse + GNU的ARM嵌入式GCC交叉编译器+ STM32CubeMX微控制器外围初始化和链接脚本制作的STM32微控制器。

当我加入了缺失的字符串libg.a (*)和libnosys.a去除部分(*) .ld剧本,我的项目是成功打造。



Answer 5:

我创造了使用CubeMX的RTOS项目,并增加了printf和有同样的问题上连接,同时使用OpenOCD的调试。

我trace_puts( “你好!ARM世界”)取代的printf( “你好ARM的世界!”); 并且有消息显示在调试控制台。



文章来源: Linker error on a C project using Eclipse