天天看點

樹莓派交叉編譯

1.什麼是交叉編譯

編譯:在一個平台上生成該平台上的可執行代碼。

交叉編譯:在一個平台上生成另一個平台上的可執行代碼。同一個體系結構可以運作不同的作業系統;同樣,同一個作業系統也可以在不同的體系結構上運作。

我們在 windows 上編寫 C51 代碼,并編譯成可執行代碼,如 xx.hex,是在 C51 上運作,而不是在windows 上運作。

我們在 ubuntu 上編寫樹莓派的代碼,并編譯成可執行代碼,如 a.out,是在樹莓派上運作,不是在ubuntu linux上運作。

2.為什麼要交叉編譯

既然我們已經有了主機編譯器,那為什麼還要交叉編譯呢?

有時是因為目的平台上不允許或不能夠安裝我們所需要的編譯器(如 C51),而我們又需要這個編譯器的某些特征。

有時是因為目的平台上的資源貧乏,無法運作我們所需要編譯器。

有時是因為目的平台還沒有建立,連作業系統都沒有,根本談不上運作什麼編譯器。如樹莓派,作業系統也是代碼,也要編譯,平台運作需要兩樣至少東西:bootloader(啟動引導代碼)以及作業系統核心。

主控端(host) :編輯和編譯程式的平台,一般是基于 X86 的 PC 機,通常也被稱為主機。

目标機(target):使用者開發的系統,通常都是非 X86 平台。host 編譯得到的可執行代碼在 target 上運作。

3.交叉編譯需要的工具:

交叉編譯器,交叉編譯工具鍊

檢查交叉編譯工具對不對:

arm-linux-gnueabihf-gcc -v

編譯指令:

arm-linux-gnueabihf-gcc xxx.c -o xxx

4.交叉編譯工具鍊的安裝

将壓縮包放到 樹莓派 或 Ubuntu 上

1.解壓檔案

2.此時進入

/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

路徑

樹莓派交叉編譯

可以看到我們的交叉編譯工具

arm-linux-gnueabihf-gcc
           
樹莓派交叉編譯

但是我們每次都要進入到這個目錄中來編譯太麻煩了,此時我們可以添加 arm-linux-gnueabihf-gcc 所在路徑到環境變量中去

5.配置環境變量

方法一(臨時有效):

1.擷取目前環境變量的值:

echo $PATH

2.擷取交叉編譯工具鍊所在路徑:

pwd

3.配置環境變量:

export PATH=echo $PATH+pwd

樹莓派交叉編譯

方法二(永久有效):

1.進入工作目錄

2.修改工作目錄下的

.bashrc

隐藏檔案:

vi /home/xxx/.bashrc
           

在檔案的最後一行加上 配置環境變量的語句(

export PATH=echo $PATH+pwd

):

樹莓派交叉編譯

3.加載配置檔案,馬上生效配置:

source /home/xxx/.bashrc
           

6.帶wiringPi 庫的交叉編譯:

1.正常情況下,我們要先要交叉編譯 wiringPi 庫,編譯出的庫适合樹莓派,這時候交叉編譯可執行程式的時候,連結庫的格式也是正确的

若連結的庫的格式不正确,是主控端的平台,交叉編譯時會出現以下錯誤:

cannot find -lwiringPi collect2: error: ld returned 1 exit status
           

2.通過 -I(大寫i),-L 來指定

3.可以直接把樹莓派的 wiringPi 庫拿到 PC 機上使用:

樹莓派中的 wiringPi 庫路徑:

libwiringPi.so.2.50

才是所需要 wiringPi 動态庫

(1)建立軟連結:

概念:

1. 軟連結檔案有類似于Windows的快捷方式。

2. 在符号連接配接中,檔案實際上是一個文本檔案,其中包含的有另一檔案的位置資訊。

3. 你標明的位置上生成一個檔案的鏡像,不會占用磁盤空間

ln -s 源檔案 目标檔案:

ln  -s  libwiringPi.so.2.50  libwiringPi.so 
           

(2)建立硬連結:

ln 源檔案 目标檔案:

ln  libwiringPi.so.2.50  libwiringPi.so
           

它會在你標明的位置上生成一個和源檔案大小相同的檔案

注意1:

ln -s

隻會在你標明的位置上生成一個檔案的鏡像,不會占用磁盤空間,硬連結ln,沒有參數-s,它會在你標明的位置上生成一個和源檔案大小相同的檔案,無論是軟連結還

是硬連結,檔案都保持同步變化。

繼續閱讀