在嵌入式開發中,經常會遇到目標平臺資源貧乏,無法運行需要的編譯器。亦或是目標平臺上不允許或不能夠安裝需要的編譯器。這時候就需要使用交叉編譯了。
交叉編譯
本地編譯:在當前目標平臺下,編譯出來的程序,放到當前平臺下,就可以運行的
交叉編譯:在一種平臺上編譯,編譯出來的程序,放到別的平臺上運行(編譯和運行環境不一樣,屬于交叉的)
這里所謂的平臺,實際上包含兩個概念:體系結構和操作系統。同一體系結構可以運行不同的操作系統,同一操作系統也可以在不同的體系結構上運行。
比如x86 Linux平臺,實際上是Intel x86體系結構和Linux for x86操作系統的統稱。
再比如x86 WinNT平臺,實際上是Intel x86體系結構和Windows NT for x86操作系統的統稱。
交叉編譯是一個和本地編譯,相對應的概念。主要和嵌入式開發有關,由于嵌入式系統中的各種資源相對有限,只夠嵌入式系統運行的,沒太多剩余的資源,所以很難進行直接的本地編譯。
交叉編譯工具鏈
編譯過程是按照不同的子功能,依照先后順序組成的一個復雜的流程,如下圖:
編譯過程包括了預處理、編譯、匯編、鏈接等功能。每個子功能都是一個單獨的工具來實現,它們合在一起形成了一個完整的工具集。
同時編譯過程又是一個有先后順序的流程,牽涉到工具的使用順序,每個工具按照先后關系串聯在一起,形成了一個編譯工具鏈。
交叉編譯工具鏈就是為了編譯跨平臺體系結構的程序代碼而形成的由多個子工具構成的一套完整的工具集。
同時,它隱藏了預處理、編譯、匯編、鏈接等細節,當我們指定了源文件(.c)時,它會自動按照編譯流程調用不同的子工具,自動生成最終的二進制程序映像(.bin)。
交叉編譯工具鏈命名規則:
在使用交叉編譯鏈時,常常會看到下面這樣的名字:
arm-linux-gnueabihf- arm-none-linux-gnueabi- arm-cortex_a8-linux-gnueabi- mips-malta-linux-gnu-
這些交叉編譯鏈的命名通常會遵循一定的規則:arch-vender-os-abi,各字段說明如下:
arch:目標cpu架構,比如mips、arm、x86、riscv等,通常不會省略
vendor:提供此編譯工具鏈的廠商名稱或特定信息,標識信息,沒有實際意義,可以為none、cross、unknow或是直接省略
os:目標設備上運行的操作系統,常見的有linux、none(裸機)等
abi:應用程序二進制接口,交叉編譯鏈所選擇的庫函數和目標映像的規范,常見的值有abi 、eabi(embedded abi)、gun(glibc+oabi)、gnueabi(glibc+eabi)、gnueabihf(hf 指默認編譯參數支持硬件浮點功能)等
審核編輯:湯梓紅
-
嵌入式
+關注
關注
5082文章
19126瀏覽量
305197 -
Linux
+關注
關注
87文章
11304瀏覽量
209498 -
操作系統
+關注
關注
37文章
6825瀏覽量
123331 -
交叉編譯
+關注
關注
0文章
32瀏覽量
12642
原文標題:什么是交叉編譯?為什么需要交叉編譯?
文章出處:【微信號:嵌入式攻城獅,微信公眾號:嵌入式攻城獅】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論