在linux中,交叉編譯是一種計(jì)算機(jī)環(huán)境中運(yùn)行的編譯程序,能編譯出另外一種環(huán)境下運(yùn)行的代碼;交叉編譯出來(lái)的程序,所要運(yùn)行的目標(biāo)環(huán)境中,各種資源,都相對(duì)有限,所以很難進(jìn)行直接的本地編譯,有時(shí)是因?yàn)槟康钠脚_(tái)上不允許或不能夠安裝我們所需要的編譯器,而我們又需要這個(gè)編譯器的某些特征,所以需要使用交叉編譯。
本教程操作環(huán)境:linux7.3系統(tǒng)、Dell G3電腦。
linux交叉編譯有什么用
什么是交叉編譯
本地編譯
解釋什么是交叉編譯之前,先要明白一個(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)行的。
?交叉編譯
交叉編譯,是一個(gè)和,本地編譯,相對(duì)應(yīng)的概念。
而所謂的,交叉編譯,就是:在一種平臺(tái)上編譯,編譯出來(lái)的程序,是放到別的平臺(tái)上運(yùn)行即編譯的環(huán)境,和運(yùn)行的環(huán)境不一樣,屬于交叉的,此所謂 cross。
交叉編譯,這個(gè)概念,主要和嵌入式開發(fā)有關(guān)。
例 如.:在x86平臺(tái)上編譯,在ARM平臺(tái)上運(yùn)行。
一種最常見的例子就是:
在進(jìn)行嵌入式開發(fā)時(shí)手上有個(gè)嵌入式開發(fā)板,CPU是arm的然后在x86的平臺(tái)下開發(fā),比如Ubuntu的Linux,或者是Win 10然后就需要:
在x86的平臺(tái)上,(用交叉編譯器)去編譯你寫好的程序代碼
編譯生成的(可執(zhí)行的)程序,是放到目標(biāo)開發(fā)板,arm的CPU上運(yùn)行的
此所謂:在x86平臺(tái)上編譯,在ARM平臺(tái)上運(yùn)行。
交叉編譯,英文常寫作cross compile,也有其他寫法:crosscompile, cross compiling 等。
為何要有交叉編譯
之所以要有交叉編譯,主要原因是:嵌入式系統(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ō)的,交叉編譯
推薦學(xué)習(xí):Linux視頻教程