原文連接:
http://blog.csdn.net/hanzengyi/article/details/5991915linux
(一)交叉編譯器簡介c++
在一種計算機環境中運行的編譯程序,能編譯出在另一種環境下運行的代碼,這個編譯過程就叫交叉編譯.簡單地說,就是在一個平臺上生成另外一個平臺上的可執行代碼.
(二)體系結構與操做系統 windows
(1)常見的體系結構有ARM結構、x86結構等.架構
(2)常見的操做系統有linux,windows等.app
(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的編譯器來編譯程序.優化
(三)使用交叉編譯器的緣由url
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!