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
路徑
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLycjMyITNwkTM3EzMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
可以看到我們的交叉編譯工具
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,它會在你標明的位置上生成一個和源檔案大小相同的檔案,無論是軟連結還
是硬連結,檔案都保持同步變化。