在嵌入式開(kāi)發(fā)中,經(jīng)常會(huì)遇到目標(biāo)平臺(tái)資源貧乏,無(wú)法運(yùn)行需要的編譯器。亦或是目標(biāo)平臺(tái)上不允許或不能夠安裝需要的編譯器。這時(shí)候就需要使用交叉編譯了。
交叉編譯
本地編譯:在當(dāng)前目標(biāo)平臺(tái)下,編譯出來(lái)的程序,放到當(dāng)前平臺(tái)下,就可以運(yùn)行的
交叉編譯:在一種平臺(tái)上編譯,編譯出來(lái)的程序,放到別的平臺(tái)上運(yùn)行(編譯和運(yùn)行環(huán)境不一樣,屬于交叉的)
這里所謂的平臺(tái),實(shí)際上包含兩個(gè)概念:體系結(jié)構(gòu)和操作系統(tǒng)。同一體系結(jié)構(gòu)可以運(yùn)行不同的操作系統(tǒng),同一操作系統(tǒng)也可以在不同的體系結(jié)構(gòu)上運(yùn)行。
比如x86 Linux平臺(tái),實(shí)際上是Intel x86體系結(jié)構(gòu)和Linux for x86操作系統(tǒng)的統(tǒng)稱(chēng)。
再比如x86 WinNT平臺(tái),實(shí)際上是Intel x86體系結(jié)構(gòu)和Windows NT for x86操作系統(tǒng)的統(tǒng)稱(chēng)。
交叉編譯是一個(gè)和本地編譯,相對(duì)應(yīng)的概念。主要和嵌入式開(kāi)發(fā)有關(guān),由于嵌入式系統(tǒng)中的各種資源相對(duì)有限,只夠嵌入式系統(tǒng)運(yùn)行的,沒(méi)太多剩余的資源,所以很難進(jìn)行直接的本地編譯。
交叉編譯工具鏈
編譯過(guò)程是按照不同的子功能,依照先后順序組成的一個(gè)復(fù)雜的流程,如下圖:

編譯過(guò)程包括了預(yù)處理、編譯、匯編、鏈接等功能。每個(gè)子功能都是一個(gè)單獨(dú)的工具來(lái)實(shí)現(xiàn),它們合在一起形成了一個(gè)完整的工具集。
同時(shí)編譯過(guò)程又是一個(gè)有先后順序的流程,牽涉到工具的使用順序,每個(gè)工具按照先后關(guān)系串聯(lián)在一起,形成了一個(gè)編譯工具鏈。
交叉編譯工具鏈就是為了編譯跨平臺(tái)體系結(jié)構(gòu)的程序代碼而形成的由多個(gè)子工具構(gòu)成的一套完整的工具集。
同時(shí),它隱藏了預(yù)處理、編譯、匯編、鏈接等細(xì)節(jié),當(dāng)我們指定了源文件(.c)時(shí),它會(huì)自動(dòng)按照編譯流程調(diào)用不同的子工具,自動(dòng)生成最終的二進(jìn)制程序映像(.bin)。
交叉編譯工具鏈命名規(guī)則:
在使用交叉編譯鏈時(shí),常常會(huì)看到下面這樣的名字:
arm-linux-gnueabihf- arm-none-linux-gnueabi- arm-cortex_a8-linux-gnueabi- mips-malta-linux-gnu-
這些交叉編譯鏈的命名通常會(huì)遵循一定的規(guī)則:arch-vender-os-abi,各字段說(shuō)明如下:
arch:目標(biāo)cpu架構(gòu),比如mips、arm、x86、riscv等,通常不會(huì)省略
vendor:提供此編譯工具鏈的廠商名稱(chēng)或特定信息,標(biāo)識(shí)信息,沒(méi)有實(shí)際意義,可以為none、cross、unknow或是直接省略
os:目標(biāo)設(shè)備上運(yùn)行的操作系統(tǒng),常見(jiàn)的有l(wèi)inux、none(裸機(jī))等
abi:應(yīng)用程序二進(jìn)制接口,交叉編譯鏈所選擇的庫(kù)函數(shù)和目標(biāo)映像的規(guī)范,常見(jiàn)的值有abi 、eabi(embedded abi)、gun(glibc+oabi)、gnueabi(glibc+eabi)、gnueabihf(hf 指默認(rèn)編譯參數(shù)支持硬件浮點(diǎn)功能)等
審核編輯:湯梓紅
-
嵌入式
+關(guān)注
關(guān)注
5177文章
20003瀏覽量
325580 -
Linux
+關(guān)注
關(guān)注
88文章
11581瀏覽量
217174 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
7267瀏覽量
128169 -
交叉編譯
+關(guān)注
關(guān)注
0文章
36瀏覽量
12954
原文標(biāo)題:什么是交叉編譯?為什么需要交叉編譯?
文章出處:【微信號(hào):嵌入式攻城獅,微信公眾號(hào):嵌入式攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
嵌入式開(kāi)發(fā)入門(mén)之旅
嵌入式開(kāi)發(fā)入門(mén)之旅
嵌入式開(kāi)發(fā)工具使用
交叉調(diào)試器嵌入式開(kāi)發(fā)的流程步驟
嵌入式開(kāi)發(fā)流程
嵌入式開(kāi)發(fā)流程是怎樣的?
嵌入式開(kāi)發(fā)
嵌入式交叉編譯環(huán)境的搭建解析
干貨:嵌入式Ubuntu實(shí)踐之交叉編譯環(huán)境的建立
嵌入式開(kāi)發(fā)(一):嵌入式開(kāi)發(fā)新手入門(mén)
嵌入式開(kāi)發(fā)資料免費(fèi)分享
【嵌入式實(shí)驗(yàn)】《嵌入式開(kāi)發(fā)工具使用》
嵌入式開(kāi)發(fā)Linux入門(mén)
嵌入式開(kāi)發(fā)(一):嵌入式開(kāi)發(fā)新手入門(mén)(轉(zhuǎn)載后續(xù)需要修改補(bǔ)充)

嵌入式開(kāi)發(fā)中的交叉編譯詳解
評(píng)論