原文鏈接:
http://blog.csdn.net/hanzengyi/article/details/5991915
(一)交叉編譯器簡介
在一種計算機環境中運行的編譯程序,能編譯出在另外一種環境下運行的代碼,這個編譯過程就叫交叉編譯.簡單地說,就是在一個平台上生成另一個平台上的可執行代碼.
(二)體系結構與操作系統
(1)常見的體系結構有ARM結構、x86結構等.
(2)常見的操作系統有linux,windows等.
(3)同一個體系結構可以運行不同操作系統,如x86上可以運行Linux、Windows等,在ARM上可以運行Linux、WinCE.
(4)同一個操作系統可以在不同的體系結構上運行,比如Linux可以運行在x86上,也可以運行在ARM上.
(5)同樣的程序不可能運行在多個平台上,比如Windows下應用程序不能在Linux下運行.如果一個應用程序想在另一個平台上運行,必須使用針對該平台的編譯器,來重新編譯該應用程序的二進制代碼.比如在Linux系統下運行Windows平台的QQ軟件,必須按照以下幾個步驟:
1.QQ程序源代碼
2.使用Linux下的編譯器來編譯QQ軟件的源代碼
這樣編譯出來的可執行程序就可以在Linux下運行了.所以,如何使ARM來運行用戶的應用程序呢,就需要用到針對ARM的編譯器來編譯程序.
(三)使用交叉編譯器的原因
ARM上可以運行操作系統,所以用戶完全可以將ARM當做計算機來使用,理論上也可以在ARM上使用本地的編譯器來編譯程序.但是,編譯器在編譯程序時,會產生大量的中間文件,這會占用很大的內存和磁盤空間,且對CPU處理速度要求較高,比如S3C2440A內存、磁盤空間只有幾十到100多兆,CPU只有400-500MHz,完全達不到編譯程序的要求.所以,在進行ARM-linux嵌入式開發時必須在PC機(x86結構)上編譯出能夠運行在ARM上的程序,然后再將程序下載到 ARM中來運行.這就用到了交叉編譯器.
要進行交叉編譯,用戶需要在主機平台上安裝對應的交叉編譯工具鏈(cross compilation tool chain),然后用這個交叉編譯工具鏈編譯用戶的源代碼,最終生成可在目標平台上運行的代碼.交叉編譯工具鏈可以從網上下載,也可以自己制作.但編譯器不是萬能的,受版本限制,編譯某些程序時會報錯.常見的交叉編譯工具鏈有:
(1)Cross -2.95.3 tar: 該版本較早,除了編譯vivi外一般不使用.
(2)arm920t-eabi.tgz: 4.1.2版本的編譯器,支持eabi,可以編譯TX2440A開發板上的所有程序.(貌似我們代碼里面的就是這個工具)
(3)arm-linux-gcc: 4.3.2版本的編譯器,支持eabi,是最常見的交叉工具鏈.
Attention!!!
什么是EABI
EABI,Embeded application binary interface,即嵌入式應用二進制接口,是描述可連接目標代碼、庫目標代碼、可執行文件影像、如何連接、執行和調試以及目標代碼生成過程,和c, c++語言接口的規范,是編譯連接工具的基礎規范,也是研究它們工作原理的基礎.簡而言之,EABI就是一種編譯規范,交叉編譯器在編譯時,對於浮點運算會使用硬浮點運算,而對於沒有硬浮點運算的處理器,比如S3C2440,會使用軟浮點,但這樣會在速度上受到很大的限制,而EABI則對浮點運算進行了優化,提高了浮點運算的性能,節省了編譯時間.
(四)安裝交叉工具鏈arm-linux-gcc 4.3.2 (我下的是4.4.3)
安裝交叉編譯器arm-linux-gcc就是在主機平台(pc機的Linux操作系統)上安裝對應的交叉編譯工具鏈,換句話說,是將交叉編譯器arm-linux-gcc 4.3.2在Linux操作系統下安裝.安裝步驟:
(1)網上下載個壓縮包,我下載的是arm-linux-gcc-4.4.3-20100728.tar.gz,地址:http://arm9.net/download.asp
(2)解壓軟件包arm-linux-gcc-4.4.3.tgz.
[root@localhost lishuai]#tar xzvf arm-linux-gcc4.4.3.tgz
1.目錄4.4.3就是該交叉編譯器的目錄.從arm-linux-gcc-4.4.3.tgz解壓信息來看,該軟件包需要解壓在usr/local/arm下
2.進入目錄usr/local/內,並沒有找到arm文件夾,所以需要新建一arm文件夾,再將目錄4.4.3移動到新建目錄usr/local/arm下.其中,4.4.3/bin就是arm-linux-gcc的可執行文件.
[root@localhost local]#mv /home/lishuai/usr/local/arm/4.4.3 ./
我用的命令是: #cp -rv /media/文檔/opt/FirendlyARM/toolschain/4.4.3 /usr/local/arm 就是把4.4.3這個文件夾拷貝到/usr/local/arm下
3.進入目錄/usr/local/arm/4.4.3/bin,可以看到不同類型的編譯器.但在ARM下經常用到是arm-linux-gcc.其實它也是一個gcc編譯器,與gcc使用方法一致,不過該編譯器是針對arm體系結構、Linux操作系統的編譯器.利用該編譯器就可以編譯出運行在ARM上的Linux操作系統下的應用程序.
4.進入目錄/usr/local/arm/4.4.3/arm-none-linux-gnueabi.其中,lib目錄下存放的是庫文件,用戶編寫的應用程序在運行時就依賴於這些庫文件.
5.此時還不能編譯源碼,系統一般會提示找不到命令arm-linux-gcc.這是環境變量在作祟.所以必須修改環境變量PATH.
[root@localhost lishuai]#vi /etc/profile 這里我還是比較喜歡用gedit...
在最后一行的下面添加環境變量,
輸入:export PATH=/usr/local/arm/4.4.3/bin:$PATH
指定變量PATH為交叉編譯器的路徑,目的是告訴操作系統可以到目錄/usr/local/arm/4.4.3/bin下查找可執行文件
6.[root@localhost lishuai#:source /etc/profile
//使已修改的配置文件/etc/profile生效
7.查看arm-linux-gcc編譯器的版本
[root@localhost lishuai]#arm-linux-gcc -v
(五)arm-linu-gcc應用實例
我這邊寫了個簡單的helloWorld.c程序
#include <stdio.h>
int main()
{
printf("hello world!\n");
return 0;
}
先使用 gcc -o hello_x86 hello.c 編譯生成hello_x86文件
再使用arm-linux-gcc -o hello_arm hello.c -static 編譯生成hello_arm文件 (注意這邊要加個-static 靜態鏈接,如果不加,默認動態鏈接,拷貝到開發板會出錯,可能是由於編譯器的版本和編譯內核的版本不一致造成的,Google、百度了一天也沒結果。)
編譯完畢后,可以看到生成的hello_arm和hello_x86文件,
./hello_x86 執行結果為:hello world!
./hello_arm 執行結果為:無法打開二進制文件
使用file命令查看:file hello_arm 它會告訴你只能在arm體系結構下運行。
剩下的就是把hello_arm拷貝到arm架構的開發板上去,看看運行結果是不是hello world!