2011-06-27 57 views
1

失去了一些東西我安裝了CodeSourcery的G ++工具鏈,並試圖編譯一個簡單的Hello World程序:在手臂G ++

#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 

什麼庫時我錯過了嗎?

+0

看起來它缺少運行時。也許像'crt0.o'或'-lc'? –

+0

@Kerrek SB,'-lc'沒有幫助,我在libgcc目錄中沒有'crt0.o',只有'crtbegin.o','crtend.o','crti.o','crtn。以'crt'開頭的'o'。 – Dani

+0

嘗試使用'-v'標誌運行編譯器並查看輸出。你應該看到'collect2'的實際參數,它應該包含像'-lc'和'.../crt1.o'這樣的東西。如果他們不這樣做,你的編譯器配置錯誤,請嘗試重新安裝它。 –

回答

1

GCC工具鏈只是創建工作可執行文件*所需的一半。另一半是運行時庫。運行時包含crt0.o,它包含入口點(調用main()的代碼),通常包含標準C函數(strcmp(),memcpy()等)的libc以及系統調用( open(),read()等)。你需要找到這些的來源。如果你的目標是嵌入式Linux或BSD機器,你將不得不找出你的目標正在使用的libc。它可能是GNU libc,BSD libc,newlib或uclibc。你可以獲得這些並自己構建它們,或者它們可能已經在你的操作系統中可用。

*除非你正在構建一個獨立的二進制文件,但這看起來並不像你在做什麼。

+1

我的目標是使用arm-elf文件格式的GNU/Linux。我在哪裏可以找到它的運行時間? – Dani

+0

根據誰創建分發版,您的libc可能是我提到的其中一個(例如,Debian使用glibc,但Android使用BSD libc)。這很可能是glibc,但你應該知道。 –

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(路徑)的路徑。