在g +中缺少一些东西

时间:2011-06-27 12:53:29

标签: g++ arm linker-errors

我安装了CodeSourcery g ++工具链,并尝试编译一个简单的hello world程序:

#include <iostream>

using namespace std;

int main()
{
    cout << "Hello World" << endl;
    return 0;
}

链接器出现了很多错误

$ arm-none-eabi-g++ helloworld.cpp -o helloworld.exe
bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000008018
lib/libc.a(lib_a-abort.o): In function `abort':
abort.c:(.text.abort+0x10): undefined reference to `_exit'
lib/libc.a(lib_a-fstatr.o): In function `_fstat_r':
fstatr.c:(.text._fstat_r+0x1c): undefined reference to `_fstat'
lib/libc.a(lib_a-openr.o): In function `_open_r':
openr.c:(.text._open_r+0x20): undefined reference to `_open'
lib/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text._sbrk_r+0x18): undefined reference to `_sbrk'
lib/libc.a(lib_a-signalr.o): In function `_kill_r':
signalr.c:(.text._kill_r+0x1c): undefined reference to `_kill'
lib/libc.a(lib_a-signalr.o): In function `_getpid_r':
signalr.c:(.text._getpid_r+0x4): undefined reference to `_getpid'
lib/libc.a(lib_a-writer.o): In function `_write_r':
writer.c:(.text._write_r+0x20): undefined reference to `_write'
lib/libc.a(lib_a-closer.o): In function `_close_r':
closer.c:(.text._close_r+0x18): undefined reference to `_close'
lib/libc.a(lib_a-isattyr.o): In function `_isatty_r':
isattyr.c:(.text._isatty_r+0x18): undefined reference to `_isatty'
lib/libc.a(lib_a-lseekr.o): In function `_lseek_r':
lseekr.c:(.text._lseek_r+0x20): undefined reference to `_lseek'
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

我在这里缺少什么图书馆?

3 个答案:

答案 0 :(得分:1)

GCC工具链只是创建工作可执行文件所需的一半*。另一半是运行时库。运行时包括crt0.o,它包含入口点(调用main()的代码),通常是包含标准C函数(strcmp(),memcpy()等)的libc以及系统调用( open(),read()和其他)。你需要找到这些的来源。如果您的目标是嵌入式Linux或BSD计算机,则必须找出目标所使用的libc。它可能是GNU libc,BSD libc,newlib或uclibc。您可以自己获取这些内容,也可以在操作系统中使用它们。

*除非您正在构建一个独立的二进制文件,但这看起来并不像您正在做的那样。

答案 1 :(得分:0)

基于交叉编译器,似乎最终目标是裸机。默认的gcc库(取决于操作系统)在这里不起作用。您可以使用NewlibC或NewlibC-Nano。这通常会与交叉编译器工具链一起发布。

查找已预编译NewlibC的lib文件夹。

一旦完成,

此声明可能会对您有所帮助。

arm-none-eabi-gcc --specs=rdimon.specs \
         -Wl,--start-group -lgcc -lc -lc -lm -lrdimon -Wl,--end-group $(OTHER_OPTIONS)

不要忘记提供查看库的路径-L(路径)。

答案 2 :(得分:0)

我有同样的问题。

事实证明,您可以将许多选项发送到链接器以使其开始工作,但是在我的代码库中飞溅最少的选项是

-nostartfiles