交叉編譯的概念
1. 什么是交叉編譯?
交叉編譯是指在一個平臺上生成可以在另一個平臺上運行的可執行代碼。例如,在Ubuntu Linux上編寫代碼,并編譯生成可在Orange Pi Zero2上運行的可執行文件。這個過程是通過使用一個專門的交叉編譯工具鏈來實現的。
編譯與交叉編譯的區別
- 編譯:在一個平臺上生成該平臺的可執行代碼。
- 交叉編譯:在一個平臺上生成另一個平臺的可執行代碼。
2. 為什么要進行交叉編譯?
- 目標平臺的限制:目標平臺可能沒有足夠的資源或不允許安裝編譯工具。例如,許多嵌入式系統和小型設備不具備直接編譯代碼的能力。
- 目標平臺尚未建立:在一些情況下,目標平臺的操作系統或基礎環境尚未完全建立,需要交叉編譯來生成基礎的啟動代碼和操作系統核心。
3. 宿主機(host)和目標機(target)
- 宿主機:用于編輯和編譯程序的平臺,通常是基于X86架構的PC機。
- 目標機:用戶開發的平臺,通常是非X86平臺。宿主機上編譯的可執行代碼將在目標機上運行。
4. 交叉編譯工具
工具鏈和環境設置
使用環境:
- 電腦:Ubuntu 18.04
- 開發板:Orange Pi Zero2
- 交叉編譯器:
aarch64-none-linux-gnu-
下載和安裝
-
下載交叉編譯工具鏈 下載地址:清華大學開源軟件鏡像站
下載文件:
gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz
-
上傳并解壓到虛擬機
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
設置環境變量
-
臨時設置環境變量
export PATH=$PATH:/home/ygl/orangePiZero2/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin
-
永久設置環境變量 編輯
.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
測試交叉編譯
編寫簡單的hello.c
文件,并使用交叉編譯器編譯:
aarch64-none-linux-gnu-gcc hello.c -o test
將生成的test
可執行文件上傳到Orange Pi Zero2上測試運行。
帶WiringPi庫的交叉編譯
1. 交叉編譯WiringPi庫
- 交叉編譯庫文件:首先需要交叉編譯WiringPi庫,以確保生成的庫文件適合目標開發板使用。
- 指定頭文件和庫路徑:
aarch64-none-linux-gnu-gcc your_code.c -I ./wiringOP-master/wiringPi -L. -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt -g -o your_executable
2. 文件拷貝和軟鏈接
- 拷貝庫文件: 從開發板的
/usr/local/lib
目錄下拷貝libwiringPi.so.2.46
和libwiringPiDev.so.2.46
到上位機的/home/ygl/orangePiZero2
目錄下。 - 創建軟鏈接:
ln -s libwiringPi.so.2.46 libwiringPi.so ln -s libwiringPiDev.so.2.46 libwiringPiDev.so
3. 編寫交叉編譯腳本
編寫build.sh
腳本,用于交叉編譯帶WiringPi庫的文件:
aarch64-none-linux-gnu-gcc $1 -I ./wiringOP-master/wiringPi -L. -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt -g -o $2