交叉編譯工具鏈介紹

2023-04-15 15:17:54 來源:嵌入式攻城獅

1. 交叉編譯工具鏈介紹


(資料圖片僅供參考)

1.1 交叉編譯

本地編譯:在當前目標平臺下,編譯出來的程序,放到當前平臺下,就可以運行的

交叉編譯:在一種平臺上編譯,編譯出來的程序,放到別的平臺上運行(編譯和運行環境不一樣,屬于交叉的)

交叉編譯是一個和本地編譯,相對應的概念。 主要和嵌入式開發有關,由于嵌入式系統中的各種資源相對有限,只夠嵌入式系統運行的,沒太多剩余的資源,所以很難進行直接的本地編譯

1.2 交叉編譯工具鏈

編譯過程是按照不同的子功能,依照先后順序組成的一個復雜的流程,如下圖:

編譯過程包括了預處理、編譯、匯編、鏈接等功能。 每個子功能都是一個單獨的工具來實現,它們合在一起形成了一個完整的工具集。 同時編譯過程又是一個有先后順序的流程,牽涉到工具的使用順序,每個工具按照先后關系串聯在一起,形成了一個編譯工具鏈

交叉編譯工具鏈就是為了編譯跨平臺體系結構的程序代碼而形成的由多個子工具構成的一套完整的工具集。 同時它隱藏了預處理、編譯、匯編、鏈接等細節,當指定了源文件(.c)時,它會自動按照編譯流程調用不同的子工具,自動生成最終的二進制程序映像(.bin)

注意:嚴格意義上來說,交叉編譯器,只是指交叉編譯的gcc,但是實際上為了方便,我們常說的交叉編譯器就是交叉編譯工具鏈

1.3 交叉編譯工具鏈命名規則

在使用交叉編譯鏈時,常常會看到下面這樣的名字:

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:應用程序二進制接口(Application Binary Interface),交叉編譯鏈所選擇的庫函數和目標映像的規范,該字段常見的值有abi 、eabi(embedded abi)、gun(glibc+oabi)、gnueabi(glibc+eabi)、gnueabihf (hf 指默認編譯參數支持硬件浮點功能)等

2. Ubuntu下搭建GCC交叉編譯工具鏈

Ubuntu自帶的gcc編譯器是針對X86架構的,但是我們要編譯的是ARM架構的代碼,所以需要一個在X86架構PC上運行,可以編譯ARM架構代碼的交叉編譯器

2.1 下載交叉編譯器

本文使用Linaro出品的交叉編譯器, Linaro是一間非營利開放源代碼軟件工程公司,最著名的就是Linaro GCC編譯工具鏈(編譯器),其官網可以下載源碼

Linaro 網站提供了多種GCC交叉編譯工具鏈,我們使用的是Cortex-A7內核的開發板,因此選擇arm-linux-gnueabihf,再根據32/64位系統下載不同版本的編譯器,這里選擇下載x86_64版本

2.2 安裝交叉編譯器

在Ubuntu中創建目錄/usr/local/arm

sudo mkdir /usr/local/arm

將下載好的交叉編譯器復制到該目錄中

sudo cp gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz /usr/local/arm/ -f

拷貝完成后在該目錄中對交叉編譯工具進行解壓

sudo tar -vxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz

打開/etc/profile文件,修改環境變量,在文件末尾添加如下內容

export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin

使用交叉編譯器,還需要安裝如下庫

sudo apt-get install lsb-core lib32stdc++6

2.3 交叉編譯器驗證

使用以下命令查看交叉編譯工具的版本號,若安裝正確就會顯示版本號

arm-linux-gnueabihf-gcc -v

從上圖可以看出當前交叉編譯器的版本號為4.9.4,說明交叉編譯工具鏈安裝成功。 使用交叉編譯器的命令一般是arm-linux-gnueabihf-gcc

標簽:

上一篇:
下一篇: