記錄網(wǎng)站 自己做自助建站的優(yōu)勢(shì)
交叉編譯的概念
1. 什么是交叉編譯?
交叉編譯是指在一個(gè)平臺(tái)上生成可以在另一個(gè)平臺(tái)上運(yùn)行的可執(zhí)行代碼。例如,在Ubuntu Linux上編寫(xiě)代碼,并編譯生成可在Orange Pi Zero2上運(yùn)行的可執(zhí)行文件。這個(gè)過(guò)程是通過(guò)使用一個(gè)專(zhuān)門(mén)的交叉編譯工具鏈來(lái)實(shí)現(xiàn)的。
編譯與交叉編譯的區(qū)別
- 編譯:在一個(gè)平臺(tái)上生成該平臺(tái)的可執(zhí)行代碼。
- 交叉編譯:在一個(gè)平臺(tái)上生成另一個(gè)平臺(tái)的可執(zhí)行代碼。
2. 為什么要進(jìn)行交叉編譯?
- 目標(biāo)平臺(tái)的限制:目標(biāo)平臺(tái)可能沒(méi)有足夠的資源或不允許安裝編譯工具。例如,許多嵌入式系統(tǒng)和小型設(shè)備不具備直接編譯代碼的能力。
- 目標(biāo)平臺(tái)尚未建立:在一些情況下,目標(biāo)平臺(tái)的操作系統(tǒng)或基礎(chǔ)環(huán)境尚未完全建立,需要交叉編譯來(lái)生成基礎(chǔ)的啟動(dòng)代碼和操作系統(tǒng)核心。
3. 宿主機(jī)(host)和目標(biāo)機(jī)(target)
- 宿主機(jī):用于編輯和編譯程序的平臺(tái),通常是基于X86架構(gòu)的PC機(jī)。
- 目標(biāo)機(jī):用戶(hù)開(kāi)發(fā)的平臺(tái),通常是非X86平臺(tái)。宿主機(jī)上編譯的可執(zhí)行代碼將在目標(biāo)機(jī)上運(yùn)行。
4. 交叉編譯工具
工具鏈和環(huán)境設(shè)置
使用環(huán)境:
- 電腦:Ubuntu 18.04
- 開(kāi)發(fā)板:Orange Pi Zero2
- 交叉編譯器:
aarch64-none-linux-gnu-
下載和安裝
-
下載交叉編譯工具鏈 下載地址:清華大學(xué)開(kāi)源軟件鏡像站
下載文件:
gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz
-
上傳并解壓到虛擬機(jī)
cp /home/ygl/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz /home/orangpiZero2 tar -xf gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz cd gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin
設(shè)置環(huán)境變量
-
臨時(shí)設(shè)置環(huán)境變量
export PATH=$PATH:/home/ygl/orangePiZero2/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin
-
永久設(shè)置環(huán)境變量 編輯
.bashrc
文件:vi /home/ygl/.bashrc
在最后一行加入:
export PATH=$PATH:/home/ygl/orangePiZero2/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin
使其生效:
source /home/ygl/.bashrc
測(cè)試交叉編譯
編寫(xiě)簡(jiǎn)單的hello.c
文件,并使用交叉編譯器編譯:
aarch64-none-linux-gnu-gcc hello.c -o test
將生成的test
可執(zhí)行文件上傳到Orange Pi Zero2上測(cè)試運(yùn)行。
帶WiringPi庫(kù)的交叉編譯
1. 交叉編譯WiringPi庫(kù)
- 交叉編譯庫(kù)文件:首先需要交叉編譯WiringPi庫(kù),以確保生成的庫(kù)文件適合目標(biāo)開(kāi)發(fā)板使用。
- 指定頭文件和庫(kù)路徑:
aarch64-none-linux-gnu-gcc your_code.c -I ./wiringOP-master/wiringPi -L. -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt -g -o your_executable
2. 文件拷貝和軟鏈接
- 拷貝庫(kù)文件: 從開(kāi)發(fā)板的
/usr/local/lib
目錄下拷貝libwiringPi.so.2.46
和libwiringPiDev.so.2.46
到上位機(jī)的/home/ygl/orangePiZero2
目錄下。 - 創(chuàng)建軟鏈接:
ln -s libwiringPi.so.2.46 libwiringPi.so ln -s libwiringPiDev.so.2.46 libwiringPiDev.so
3. 編寫(xiě)交叉編譯腳本
編寫(xiě)build.sh
腳本,用于交叉編譯帶WiringPi庫(kù)的文件:
aarch64-none-linux-gnu-gcc $1 -I ./wiringOP-master/wiringPi -L. -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt -g -o $2