一、交叉編譯簡(jiǎn)介
1、什么是交叉編譯
1.1 本地編譯
解釋什么是交叉編譯之前,先要明白一個(gè)概念:本地編譯
我們之前常見的軟件開發(fā),都是屬于本地編譯:在當(dāng)前的PC下,x86的CPU下,直接編譯出來(lái)程序,可以運(yùn)行的程序(或者庫(kù)文件),其可以直接在當(dāng)前的環(huán)境,即x86的CPU下,當(dāng)前電腦中,運(yùn)行。
此時(shí)的編譯,可以叫做,本地編譯,即在當(dāng)前目標(biāo)平臺(tái)下,編譯出來(lái)的程序,也只是放到當(dāng)前平臺(tái)下,就可以運(yùn)行的。
2.2 交叉編譯
交叉編譯,是一個(gè)和,本地編譯,相對(duì)應(yīng)的概念。
而所謂的,交叉編譯,就是:在一種平臺(tái)上編譯,編譯出來(lái)的程序,是放到別的平臺(tái)上運(yùn)行即編譯的環(huán)境,和運(yùn)行的環(huán)境不一樣,屬于交叉的,此所謂cross。
交叉編譯,這個(gè)概念,主要和嵌入式開發(fā)有關(guān)。
例 1.1. 在x86平臺(tái)上編譯,在ARM平臺(tái)上運(yùn)行
一種最常見的例子就是:
在進(jìn)行嵌入式開發(fā)時(shí)手上有個(gè)嵌入式開發(fā)板,CPU是arm的然后在x86的平臺(tái)下開發(fā),比如Ubuntu的Linux,或者是Win7然后就需要:
在x86的平臺(tái)上,(用交叉編譯器)去編譯你寫好的程序代碼
編譯生成的(可執(zhí)行的)程序,是放到目標(biāo)開發(fā)板,arm的CPU上運(yùn)行的
此所謂:在x86平臺(tái)上編譯,在ARM平臺(tái)上運(yùn)行
交叉編譯,英文常寫作cross compile,也有其他寫法:crosscompile, cross compiling等
2、為何要有交叉編譯
之所以要有交叉編譯,主要原因是:嵌入式系統(tǒng)中的資源太少
具體的解釋就是:交叉編譯出來(lái)的程序,所要運(yùn)行的目標(biāo)環(huán)境中,各種資源,都相對(duì)有限,所以很難進(jìn)行直接的本地編譯
最常見的情況是:在進(jìn)行嵌入式開發(fā)時(shí),目標(biāo)平臺(tái),即嵌入式開發(fā)板,比如是最大主頻200MHz的ARM的CPU,加上32M的RAM,加上1G的Nand Flash等等。在如此相對(duì)比較緊張的硬件資源的前提下,在已經(jīng)運(yùn)行了嵌入式Linux的前提下,是沒法很方便的直接在嵌入式Linux下,去本地編譯,去在ARM的CPU下,編譯出來(lái),供ARM的CPU可以運(yùn)行的程序的。因?yàn)榫幾g,開發(fā),都需要相對(duì)比較多的CPU,內(nèi)存,硬盤等資源,而嵌入式開發(fā)上的那點(diǎn)資源,只夠嵌入式(Linux)系統(tǒng)運(yùn)行的,沒太多剩余的資源,供你本地編譯。
BusyBox中包含make等和編譯開發(fā)相關(guān)的工具
對(duì)應(yīng)的,等你后期熟悉了嵌入式開發(fā),熟悉了Busybox后,比如在Buildroot中去配置Busybox,或者單獨(dú)交叉編譯BusyBox時(shí):
【記錄】Ubuntu下為QEMU的arm平臺(tái)交叉編譯BusyBox
就會(huì)看到,后來(lái)的BusyBox,功能增加后,也已經(jīng)包含了一些,和編譯開發(fā)相關(guān)的工具,比如make等等
而這些工具,本來(lái)的話,只是,放在PC端使用,即在x86平臺(tái)下做開發(fā)的時(shí)候,在交叉編譯的時(shí)候,才用到的工具,現(xiàn)在,也在(BusyBox的)嵌入式環(huán)境中,支持了。
此時(shí),如果,你在BusyBox中把相關(guān)的開發(fā)工具都選上的話,
再加上,你的目標(biāo)開發(fā)板的硬件配置足夠強(qiáng)大的話,比如CPU都是以GHz為單位,等等
加上相關(guān)的開發(fā)的庫(kù)和工具都很全的話
實(shí)際上,至少理論上,也是可以在你的嵌入式Linux中,進(jìn)行,有限的,甚至是很大程度上的,本地開發(fā)即,直接在ARM的開發(fā)板上,嵌入式Linux中,直接進(jìn)行嵌入式開發(fā),進(jìn)行針對(duì)ARM的本地編譯
比如,編譯出一個(gè)helloworld,估計(jì)還是可以的
這樣,就不存在,或者說(shuō),避免了,此處所說(shuō)的,交叉編譯,而變成了本地編譯
就相當(dāng)于,之前在x86的PC端的,編譯程序放在x86的CPU上運(yùn)行的本地編譯,
在ARM的CPU,嵌入式Linux中,也實(shí)現(xiàn)了
但是很明顯,對(duì)于更加復(fù)雜的程序或者庫(kù),在ARM開發(fā)板上直接編譯的可行性和效率,相對(duì)就很低
而且如果是本身折騰Uboot等東西,本身目標(biāo)運(yùn)行環(huán)境,就沒有完整的(嵌入式Linux)系統(tǒng)的話,那么就更加沒法在目標(biāo)平臺(tái)實(shí)現(xiàn)本地編譯了。
則還是只能進(jìn)行,此處所說(shuō)的,交叉編譯
二、交叉工具鏈簡(jiǎn)介
1、什么是工具鏈
所謂的工具鏈,兩部分的含義:
a -- 工具
工具,即tool
工具,是用來(lái)干活的;此處要干的活,目標(biāo)是為了:生成(可以運(yùn)行的)程序或庫(kù)文件
而為了達(dá)成此目標(biāo),內(nèi)部的執(zhí)行過程和邏輯主要包含了:
1)、編譯
編譯的輸入(對(duì)象)是:程序代碼
編譯輸出(目標(biāo))是:目標(biāo)文件
編譯所需要的工具是:編譯器
編譯器,常見的編譯器,即為gcc
2)、鏈接
鏈接的輸入(對(duì)象)是:(程序運(yùn)行時(shí)所依賴的,或者某個(gè)庫(kù)所依賴的另外一個(gè))庫(kù)(文件)
鏈接的輸出(目標(biāo))是:程序的可執(zhí)行文件,或者是可以被別人調(diào)用的完整的庫(kù)文件
鏈接所需要的工具是:鏈接器
鏈接器,即ld
即,此處,為了將程序代碼,編譯成可執(zhí)行文件,涉及到編譯,鏈接(等其他步驟),要依賴到很多相關(guān)的工具,最核心的是編譯器gcc,鏈接器ld。而此處,所謂的工具,主要指的就是:和程序編譯鏈接等相關(guān)的gcc,ld等工具
binutils包含了ld等工具
實(shí)際上,上面所說(shuō)的ld,只是處理操作目標(biāo)文件,二進(jìn)制文件的最主要的一個(gè)工具
而和操作目標(biāo)等文件相關(guān)的,還有其他很多工具的:as,objcopy,strip,ar等等工具的
所以,對(duì)此,GNU官網(wǎng),弄出一個(gè)binutils,即binary utils,二進(jìn)制工具(包),集成了這些,和操作二進(jìn)制相關(guān)的工具集合,叫做binutils
所以,之后你所見到的,常見的工具,就是那個(gè)著名的GNU Binutils了。
b -- 鏈
鏈,即鏈條,chain
之所以能稱為鏈,你是說(shuō)明不止一個(gè)東西,然后,按照對(duì)應(yīng)的邏輯,串在一起,鏈在一起。而對(duì)應(yīng)的,涉及到的:
不止一個(gè)東西:指的是就是前面所說(shuō)的那個(gè)工具,即:和程序編譯鏈接等相關(guān)的gcc,binutils等工具
按照對(duì)應(yīng)的邏輯:指的就是,按照程序本身編譯鏈接的先后順序,即:先編譯,后鏈接,再進(jìn)行后期其他的處理等等,比如用objcopy去操作相應(yīng)的目標(biāo)文件等等。
如此的,將:
和程序編譯鏈接等相關(guān)的gcc,binutils等工具按照先編譯后鏈接等相關(guān)的編譯程序的內(nèi)在邏輯串起來(lái),就成了我們所說(shuō)的:工具鏈
2、什么是交叉工具鏈
普通所說(shuō)的,工具鏈指的是當(dāng)前自己的本地平臺(tái)的工具鏈。
用于交叉編譯的工具鏈,就叫做交叉工具鏈。即那些工具,即編譯的gcc,鏈接的ld,以及相關(guān)的工具,用于交叉編譯的,工具鏈,叫做交叉工具鏈。
交叉工具鏈,很明顯,是用來(lái),交叉編譯,跨平臺(tái)的程序所用的。交叉工具鏈,和(本地)工具鏈類似,也是包含了很多的,對(duì)應(yīng)的工具,交叉編譯版本的gcc,ld,as等等。但是,由于其中最最主要的是用于編譯的gcc,所以,我們也常把:交叉工具鏈,簡(jiǎn)稱為交叉編譯器
即嚴(yán)格意義上來(lái)說(shuō),交叉編譯器,只是指的是交叉編譯版本的gcc。但是實(shí)際上為了叫法上的方便,我們常說(shuō)的交叉編譯器,都是指的是交叉工具鏈。常說(shuō)的交叉編譯版本的gcc,比如arm-linux-gcc,實(shí)際上指代了,包含一系列交叉編譯版本的交叉工具鏈(arm-linux-gcc,arm-linux-ld,arm-linux-as等等)而此文中,后面,所說(shuō)的,如無(wú)特殊指明,均用交叉編譯器指代交叉工具鏈。
總結(jié)
交叉編譯就是在一種平臺(tái)上編譯出能運(yùn)行在體系結(jié)構(gòu)不同的另一種平臺(tái)上的程序,比如在PC平臺(tái)(X86 CPU)上編譯出能運(yùn)行在以ARM為內(nèi)核的CPU平臺(tái)上的程序,編譯得到的程序在X86 CPU平臺(tái)上是不能運(yùn)行的,必須放到ARM CPU平臺(tái)上才能運(yùn)行,雖然兩個(gè)平臺(tái)用的都是Linux系統(tǒng)。 交叉編譯工具鏈?zhǔn)且粋€(gè)由編譯器、連接器和解釋器組成的綜合開發(fā)環(huán)境,交叉編譯工具鏈主要由binutils、gcc和glibc三個(gè)部分組成。有時(shí)出于減小 libc 庫(kù)大小的考慮,也可以用別的 c 庫(kù)來(lái)代替 glibc,例如 uClibc、dietlibc 和 newlib。
-
Linux
+關(guān)注
關(guān)注
87文章
11512瀏覽量
213912 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5687瀏覽量
104951 -
交叉編譯
+關(guān)注
關(guān)注
0文章
35瀏覽量
12864 -
編輯器
+關(guān)注
關(guān)注
1文章
822瀏覽量
32061
原文標(biāo)題:交叉編譯知識(shí)解析之交叉編譯和交叉工具鏈
文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
什么是交叉編譯?為什么要交叉編譯
為什么要有交叉編譯器?
交叉編譯linux內(nèi)核(raspberry_3.6.y)
嵌入式交叉編譯環(huán)境的搭建解析
arm-linux的交叉編譯環(huán)境解析
Xilinx交叉編譯鏈的安裝步驟和驗(yàn)證
ST微電子STM8的C交叉編譯用戶指南

linux的系統(tǒng)移植——交叉編譯器

評(píng)論