2012-06-26 144 views
11

使用RaspBerry Pi和我的電腦,我試圖交叉編譯用C++編寫的簡單的helloWorld。我正在使用Code Sourcery工具鏈進行Linux編譯。RaspBerry Pi的交叉編譯

當複製了HelloWorld二進制通過TFTP到覆盆子,並給它使用chmod執行權限,接下來出現的錯誤:

「非法指令」

如果做一個「文件」在二進制我得到: 「樹莓:ELF 32位LSB可執行文件,ARM,版本1(SYSV),靜態鏈接,剝離」

這是因爲我在鏈接時使用了「-static -static-libstdC++」。

如果我不使用靜態鏈接,錯誤的是: 「段錯誤」

驗證碼:

/* 
* main.cpp 
* 
* Created on: 26/06/2012 
*  Author: ccortiz 
*/ 

#include <iostream> 
using namespace std; 

int main(void){ 

    cout << "Hello Cross Compilling for ARM!" << endl << flush; 
    return 0; 
} 

我怎麼能編譯並以正確的方式運行我的程序? 謝謝。

+0

請張貼的Hello World源,如果你的二進制拆卸後發送生成的二進制文件的樹莓。 –

+0

我認爲RaspberryPi的好處之一是它運行的是完整的操作系統,不需要交叉編譯。 –

+1

是的,但在Raspberry上編譯比在Core i5中編譯要慢。但我也想用我喜愛的Eclipse進行編程。 –

回答

16

This page告訴你在深度如何爲您的樹莓派一個交叉編譯環境。祝你好運!

+0

謝謝。 crosstools-ng對我來說工作正常。 –

+0

@CesarOrtiz如果這個工作,你應該接受這個答案。 – TheLukeMcCarthy

6

你之所以得到Segmentation fault錯誤是不同的ABI。 Raspberry Pi在運行Raspbian時使用的是linux-arm-gnueabihf ABI,它假定在硬件上支持hardfp和VFP支持(這在ARMv6環境中很少見),因此需要一些用於GCC和EGLIBC的補丁(這些補丁可以在Raspbian存儲庫中找到)。你的代碼Sourcery交叉工具鏈很可能沒有這些補丁,所以它使用另一個ABI(linux-arm-gnueabi),因此運行時崩潰(因爲內核ABI不依賴於hardfp/softfp,靜態鏈接工作)。

爲什麼你可能會得到Illegal Instruction錯誤的另一個可能原因是爲ARMv7配置了Code Sourcery交叉工具鏈,而Raspberry Pi是ARMv6。但是在這種情況下,靜態鏈接和動態鏈接都會產生相同的錯誤。

Here is a step-by-step guide how to build Raspberry Pi cross compiler in Windows,都是hardfp/softfp ABI版本。由此產生的交叉編譯器支持C++,並且不依賴於cygwin運行時庫(cygwin1.dll)。

0

問題是在我的FTP傳輸中使用ASCII模式而不是二進制模式。 今天我更喜歡使用SFTP(SSH)。 謝謝。

0

使用Visual Studio和Visual GDB插件,您可以下載樹莓派的交叉編譯器。之後,您可以創建一個ssh連接,也可以將您的程序遠程部署到樹莓派中。

3

我建議你嘗試biicode,它會自動設置交叉編譯環境,爲您和建設

+0

鏈接已關閉。 – Hannes

+0

修復了,謝謝告訴 – hithwen