一、什么是交叉編譯、為什么要交叉編譯
1、什么是交叉編譯?
交叉編譯:是在一個平臺上生成另一個平臺上的可執(zhí)行代碼。比如我們在 x86 平臺上,編寫程序并編譯成能運行在 ARM 平臺的程序,編譯得到的程序在 x86 平臺上是不能運行的,必須放到?ARM?平臺上才能運行。
我們在Windows上面編寫C51代碼,并編譯成可執(zhí)行代碼,如xx.hex,是在c51上面運行,不是在windows上面運行
編譯:是在一個平臺上生成在該平臺上的可執(zhí)行代碼,
2、為什么要交叉編譯?
2.1、交叉編譯的目標系統(tǒng)一般都是內(nèi)存較小、顯示設備簡陋甚至沒有,沒有能力在其上進行本地編譯,無法運行我們所需要編譯器,比如C51,C51 交叉編譯的發(fā)生在keil(集成環(huán)境上面)
2.2、有能力進行源代碼編譯的平臺CPU架構或操作系統(tǒng)與目標平臺不同;
平臺運行需要兩樣至少東西:bootloader(啟動引導代碼)以及操作系統(tǒng)核心
交叉編譯器用到的工具:交叉編譯器
?要進行交叉編譯,我們需要在主機平臺上安裝對應的交叉編譯工具鏈(cross compilation tool chain),然后用這個交叉編譯工具鏈編譯我們的源代碼,最終生成可在目標平臺上運行的代碼。
如:在Linux PC上,利用arm-linux-gcc編譯器,可編譯出針對Linux ARM平臺的可執(zhí)行代碼。
二、交叉編譯工具鏈的安裝
- ?樹莓派交叉編譯工具鏈安裝
下載地址:
https://github.com/raspberrypi/
- OrangePi_Zero2交叉編譯工具鏈安裝
參考OrangePi_Zero2用戶手冊Orange Pi Zero2-Orange Pi官網(wǎng)-香橙派(Orange Pi)開發(fā)板,開源硬件,開源軟件,開源芯片,電腦鍵盤
從共享文件夾拷貝到工作目錄
cp /mnt/hgfs/sharefromwindows/tools-master.zip .
解壓
unzip tools-master.zip
進入文件夾bin目錄
cd /home/zyf/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
獲取路徑? ? pwd
配置環(huán)境變量
1、環(huán)境變量臨時有效
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/zyf/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
2、環(huán)境變量永久有效
修改工作目錄下的.bashrc 隱藏文件,配置命令終端的
vi /home/zyf/.bashrc?
在文件最后一行加入
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/zyf/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
加載配置文件,馬上生效配置
source /home/zyf/.bashrc
三、交叉編譯
檢查下交叉編譯工具對不對:
arm-linux-gnueabihf-gcc -v
4.8.3
編譯:
arm-linux-gnueabihf-gcc ?xxx.c -o xxx
eg:
服務端:gcc ftpserver.c -I ./ -o serverInX86? ? ? ? ?
客戶端:arm-linux-gnueabihf-gcc ftpclient1.c -I ./ -o clientInpi
把編譯生成的可執(zhí)行文件下載到開發(fā)板:
scp clientInPi pi@192.168.101.33:/home/pi
指令 文件名 開發(fā)板用戶名@開發(fā)板地址:開發(fā)板的絕對路徑
注意服務端和客戶端需要在同一網(wǎng)段
若出現(xiàn)public key問題,用以下
scp -o StrictHostKeyChecking=no ftpclientARM pi@192.168.101.33:/home/pi
四、帶wiringPi庫的交叉編譯如何進行
1、正常我們先要交叉編譯wiringpi庫,編譯出的庫適合樹莓派,這時候交叉編譯可執(zhí)行程序的試試,鏈接庫的格式也是正確的。
2、通過-I –L來指定
因為鏈接的庫的格式不對,是宿主機的平臺,會出現(xiàn)錯誤
解決:把樹莓派上的wiringpi庫拿上來用
3、軟鏈接的引入?
軟鏈接:
1、軟連接文件有類似于Windows的快捷方式
2、在符號鏈接中,文件實際上是一個文本文件,其中包含的有另一文件的位置信息。
3、只在你選定的位置上生成一個文件的鏡像,不占用磁盤空間
4、如何生成軟鏈接?
ln -s libwiringPi.so.2.52 libwiringPi.so
指令 參數(shù)?? 要被鏈接的文件?????? 軟鏈接名
5、硬鏈接
硬鏈接:
ln ?libwiringPi.so.2.52 libwiringPi.so
它會在你選定的位置上生成一個和源文件大小相同的文件
? 6、編譯生成
解壓wiringpi庫的tar.gz文件
命令:tar -zxvf xxx.tar.gz -C /xxx/
查看命令:man tar
編譯生成
arm-linux-gnueabihf-gcc relay1.c -I /home/zyf/share/WiringPi/wiringPi -L. –lwiringPi
(這里編譯不成功,提示需要用到glibc庫,文章來源:http://www.zghlxwxcb.cn/news/detail-437602.html
解決方案:1、把樹莓派和ubantu對應的glibc,升級到一致2、直接在樹莓派編譯,簡單高效)文章來源地址http://www.zghlxwxcb.cn/news/detail-437602.html
到了這里,關于為什么要交叉編譯?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!