树莓派:交叉编译,以及带wiringPi库的如何交叉编译
1、交叉編譯是什么?為什么要交叉編譯?
????????交叉編譯? 是在一個(gè)平臺(tái)上生成另一個(gè)平臺(tái)上的可執(zhí)行代碼
????????????編譯:在一個(gè)平臺(tái)上生成該平臺(tái)上的可執(zhí)行代碼?????
???????????????????????
===================交叉編譯是什么?====================
? ? ? ? ? ? ? ? 我們?cè)趙indows上面編寫c51代碼,并編譯成可執(zhí)行代碼,如xx.hex,
? ? ? ? ? ? ? ? 是在c51上面運(yùn)行,不是在windows上面運(yùn)行?
?????????
????????????????我們?cè)趗buntu 上面編寫樹莓派代碼,并編譯成可執(zhí)行代碼,如a.out,
? ? ? ? ? ? ? ? 是在樹莓派上面運(yùn)行,不是在 ubuntu linux上面運(yùn)行
????????????????????????c51? 交叉編譯發(fā)生在keil(集成環(huán)境環(huán)境上面)
??????????????
================為什么要交叉編譯?====================
? ? ? ? ? ????????平臺(tái)上不允許或不能夠安裝我們所需要的編譯器,比如c51
????????????????1、因?yàn)槟康钠脚_(tái)上的資源匱乏,無法運(yùn)行我們所需要的編譯器
? ? ? ? ? ? ? ? ? ? ? ? 2、樹莓派是不是就不需要交叉編譯?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 錯(cuò)。 也要。樹莓派有時(shí)又是因?yàn)槟康钠脚_(tái)還沒有建立,連操作系統(tǒng)都沒有,根本談不上運(yùn)行什么編譯器!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 操作系統(tǒng)也是代碼,也要編譯!!!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 平臺(tái)運(yùn)行至少需要兩樣?xùn)|西:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?bootloader(啟動(dòng)引導(dǎo)代碼) ,以及操作系統(tǒng)核心
? ??
?宿主機(jī)(host) :編輯和編譯程序的平臺(tái),一般是基于x86的pc機(jī),通常也被稱為主機(jī)
目標(biāo)機(jī)(target):用戶開發(fā)的系統(tǒng),通常都是非x86平臺(tái)。host 編譯得到的可執(zhí)行代碼在target上運(yùn)行? ? ? ? ? ? ?
簡(jiǎn)單來說:我們學(xué)習(xí)用的pc 機(jī)是宿主機(jī),樹莓派是目標(biāo)機(jī)?
===================交叉編譯需要用到工具:===============
? ? ? ? ? ? ? ? 交叉編譯器、交叉編譯工具鏈
======================相關(guān)代碼=======================
代碼的編輯
?代碼的編譯
?編譯出來的代碼./a.out可以運(yùn)行
==============2、交叉編譯工具鏈的安裝===================
(目標(biāo)機(jī)是樹莓派,用的工具鏈就是樹莓派的)
https://github.com/raspberrypi/
?在這個(gè)網(wǎng)址安裝
?他的界面是打開是這樣的
?
?點(diǎn)擊這里,tools就是工具鏈的意思
?進(jìn)去了是這個(gè)樣子的
?然后我們點(diǎn)擊克隆
?再點(diǎn)擊
?點(diǎn)擊最下面的
下載完就這樣啦
?解壓
unzip tools-master.zip
2.1臨時(shí)有效=======================================
? ? ? ? PATH環(huán)境變量
????????????????export??PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
? ? ? ? ? ? ? ?從windows拷貝工作目錄
? ? ? ? ? ? ? ? ? ? ? ? 用filezilla
???? ? ? ? ? ? ? ?解壓
? ? ? ? ? ? ? ? ? ? ? ? unzip tools-master.zip? ? ? ?
? ? ?
? ? ? ? ?pwd獲得路徑
????????
? ? ? ? echo $PATH 獲得當(dāng)前環(huán)境變量的值
2.2永久有效============================================
? ? ? ? 修改工作目錄下的.bashrc? ?隱藏文件,配置命令終端的
????????????????????????????????vi /home/CLC/.bashrc?
?
? ? ? ? ? ? ? ? ? ? ? ?在文件 最后一行加入:
????????????????export??PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
? ? ? ? ? ? ? ? 加載配置文件,馬上生效配置
????????????????source /home/CLC/.bashrc?
我們打開虛擬機(jī),新建一個(gè)文件夾
然后用filezilla傳輸
?再把它放到想要的地方
然后用這個(gè)指令解壓
然后用這個(gè)指令解壓
然后用這個(gè)指令解壓
解壓完成
打開看看里面都有什么?
?這有很多目錄,我們需要的在哪里呢?
?然后在bin 下面綠色的都是可執(zhí)行文件
我們需要用到的是這個(gè)軟鏈接
它實(shí)際用到的是后面的東西?
我們?nèi)×艘粋€(gè)名字指向4.8.3
這個(gè)軟鏈接是不占內(nèi)存的,只是一個(gè)符號(hào),指向4.8.3
這兩個(gè)是類似的
只是gcc -v? 編譯出來的東西在本電腦上面運(yùn)行
如果我們要在樹莓派上編譯需要./arm-linux-gnueabihf-gcc -v
?感覺到敲這么多指令是不是很麻煩?怎么辦呢?
我們能不能像gcc 一樣直接識(shí)別到呢?
這涉及到環(huán)境變量
如何顯示當(dāng)下的環(huán)境變量?
?那么如何配環(huán)境變量呢?(臨時(shí)環(huán)境變量)====================
pwd顯示當(dāng)面目錄
?export 是配置環(huán)境的意思
?然后我們直接回到工作目錄
?
?現(xiàn)在就可以識(shí)別啦
?環(huán)境變量的臨時(shí)配置方式:
你在其他的窗口,不認(rèn)識(shí)
?那么如何配環(huán)境變量呢?(永久有效環(huán)境變量)=================
?修改隱藏文件
?
?然后再最后一行加入
export??PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
?然后讓他生效
?我們現(xiàn)在打開一個(gè)新的窗口試試
可以認(rèn)識(shí)
而且里面的版本號(hào) 4.8.3
3、交叉編譯服務(wù)客戶端==================================
交叉編譯:
? ? ? ? 檢查下交叉編譯工具對(duì)不對(duì):
?????????????????????????arm-linux-gnueabihf-gcc -v
?????????????????????????4.8.3?
????????????????如何交叉編譯?
????????????????arm-linux-gnueabihf-gcc xxx.c -o xxxx
? ? ? ? ? ? ? ? 如何把編譯生成的可執(zhí)行文件下載到開發(fā)板:
????????????????????????scp test_2 pi@192.168.32.209:/home/pi
????????????????
? ? ? ? ? ? ? ? ? ? ? ? scp 是指令
? ? ? ? ? ? ? ? ? ? ? ? test_2 是文件名
? ? ? ? ? ? ? ? ? ? ? ? 開發(fā)板用戶名@開發(fā)板地址:開發(fā)板的絕對(duì)路徑
=========================================================================
新建一個(gè)test.c的文件
?里面的內(nèi)容
?給他命名test_1
file 用來查看文件的屬性
executable,可執(zhí)行的意思
x86-84,只能運(yùn)行在x86的64位電腦上
你把這個(gè)test_1,放在樹莓派上是跑不動(dòng)的
?那么如何把test.c放在樹莓派底下運(yùn)行呢?
?我在再來看一下test_2的屬性
可執(zhí)行的,可以運(yùn)行在ARM平臺(tái)的
我們?cè)趌inux平臺(tái)上先運(yùn)行一下兩者
test_2不能解析,不能運(yùn)行,因?yàn)槲覀兙幊鰜淼囊旁跇漭孪旅媾?/p>
交叉編譯的作用就產(chǎn)生啦,在x86平臺(tái)上編譯,在樹莓派上面使用
?那如何把他拷貝到樹莓派下面呢?
?那樹莓派是否拿到這個(gè)代碼了呢?
是的
那我們?nèi)绾芜\(yùn)行呢?
?那我么如果把test_1也放到樹莓派下能運(yùn)行嗎?
?運(yùn)行不了,格式錯(cuò)誤
如果想要上位機(jī)編譯的代碼,能在樹莓派上面運(yùn)行,
前提是交叉編譯過,交叉編譯的工具鏈要對(duì)
4、帶wiringPi庫的交叉編譯如何讓進(jìn)行=======================
?1、正常我們先要交叉編譯wiringPi庫,編譯出的庫適合樹莓派,這時(shí)候交叉編譯可執(zhí)行程序的時(shí)候,鏈接庫的格式也是正確的。
2、通過 -I? ? -L? 來指定
?因?yàn)殒溄訋斓母袷讲粚?duì),是宿主機(jī)的平臺(tái),出現(xiàn)以先下錯(cuò)誤
? ? ? ? ? ? ? ? arm-linux-gnueabihf-gcc demo2.c -I /home/CLC/lessonPI/WiringPi/wiringPi -lwiringPi
?
?/home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/../lib/gcc/arm-linux-gnueabihf/4.8.3/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lwiringPi
collect2: error: ld returned 1 exit status
如何解決呢?
把樹莓派的wiringPI庫拿上來用
樹莓派的wiringPi庫在哪呢?‘
cd /usr/lib/
======================================================================
軟鏈接:
參考文章:
http://www.cnblogs.com/zhangna1998517/p/11347364.html
ln -s 是linux中一個(gè)非常重要命令,一定要熟悉。它的功能是為某一個(gè)文件在另外一個(gè)位置建立一個(gè)同不的鏈接,這個(gè)命令最常用的參數(shù)是-s, 具體用法是:ln -s 源文件 目標(biāo)文件。 當(dāng) 我們需要在不同的目錄,用到相同的文件時(shí),我們不需要在每一個(gè)需要的目錄下都放一個(gè)必須相同的文件,我們只要在某個(gè)固定的目錄,放上該文件,然后在其它的 目錄下 用ln命令鏈接 (link)它就可以,不必重復(fù)的占用磁盤空間。例如:ln -s /bin/less /usr/local/bin/less -s 是代號(hào)(symbolic)的意思。 這 里有兩點(diǎn)要注意:第一,ln命令會(huì)保持每一處鏈接文件的同步性,也就是說,不論你改動(dòng)了哪一處,其它的文件都會(huì)發(fā)生相同的變化;第二,ln的鏈接又軟鏈接 和硬鏈接 兩種,軟鏈接就是 ln -s ** **,它只會(huì)在你選定的位置上生成一個(gè)文件的鏡像,不會(huì)占用磁盤空間,硬鏈接ln ** **,沒有參數(shù)-s, 它會(huì)在你選定的位置上生成一個(gè)和源文件大小相同的文件,無論是軟鏈接還 是硬鏈接,文件都保持同步變化。【硬連接】
硬連接指通過索引節(jié)點(diǎn)來進(jìn)行連接。在Linux的文件系統(tǒng)中,保存在磁盤分區(qū)中的文件不管是什么類型都給它分配一個(gè)編號(hào),稱為索引節(jié)點(diǎn)號(hào)(Inode Index)。在Linux中,多個(gè)文件名指向同一索引節(jié)點(diǎn)是存在的。一般這種連接就是硬連接。硬連接的作用是允許一個(gè)文件擁有多個(gè)有效路徑名,這樣用戶就可以建立硬連接到重要文件,以防止“誤刪”的功能。其原因如上所述,因?yàn)閷?duì)應(yīng)該目錄的索引節(jié)點(diǎn)有一個(gè)以上的連接。只刪除一個(gè)連接并不影響索引節(jié)點(diǎn)本身和其它的連接,只有當(dāng)最后一個(gè)連接被刪除后,文件的數(shù)據(jù)塊及目錄的連接才會(huì)被釋放。也就是說,文件真正刪除的條件是與之相關(guān)的所有硬連接文件均被刪除。
【軟連接】
另外一種連接稱之為符號(hào)連接(Symbolic Link),也叫軟連接。軟鏈接文件有類似于Windows的快捷方式。它實(shí)際上是一個(gè)特殊的文件。在符號(hào)連接中,文件實(shí)際上是一個(gè)文本文件,其中包含的有另一文件的位置信息。
======================================================================
軟鏈接概念:
1.軟鏈接文件有類似windows的快捷方式。
2.在符號(hào)連接中,文件實(shí)際上是一個(gè)文本文件。其中包含的有另一文件的位置信息。
3.你選定的位置上生成一個(gè)文件的鏡像,不會(huì)占用磁盤空間
如何生成
? ? ?ln -s libwiringPiDev.so.2.50 libwiringPiDev.so
?
? ? ?????????ln? ?指令
? ? ? ? ? ???-s? ?參數(shù)
???????????????? libwiringPiDev.so.2.50要被鏈接的文件
????????????????ibwiringPiDev.so 軟鏈接文件名字
硬鏈接概念:
?????????????????ln? libwiringPiDev.so.2.50? libwiringPiDev.so
? ? ? ? ? ? ? ? 1、他會(huì)在你選定的位置上生成一個(gè)和源文件大小相同的文件
===========相關(guān)代碼================================
在我們之前寫的demo2.c里面
?他的頭文件包含wiringPi.h
?我們?nèi)绻苯觛cc 編譯的話會(huì)出現(xiàn)錯(cuò)誤,顯示不認(rèn)識(shí)這些函數(shù)
?必須得鏈接上wiringPI的庫才可以
?如果在上位機(jī)進(jìn)行交叉編譯的時(shí)候,我們并沒有wiringPI這個(gè)東西,如何辦呢?
下載代碼,在用filezilla傳輸
解壓以后傳輸?shù)絃inux下面
傳輸完以后
記得解壓完,看看里面的兩個(gè)東西
?然后我們./build輸入一下試試
發(fā)現(xiàn)全是白的運(yùn)行不了,必須是綠的才能運(yùn)行,這時(shí)候
直接用chmod 就行啦
chmod +x 文件名?
?根據(jù)README.TXT和INSTALL
?我們先./build
超級(jí)用戶需要輸入密碼
然后告訴你安裝完畢
然后我們看看他說的是不是在/usrlocal/lib/下面有
確實(shí)有這些東西,但是這些東西是不能用的
我們做個(gè)實(shí)驗(yàn)
把樹莓派的demo2.c傳輸?shù)絣inux 上面
用scp
記得Linux網(wǎng)絡(luò)改成橋接模式
?然后我們看看linux 有沒有傳過來的demo2.c
?然后我們編譯它
發(fā)現(xiàn)頭文件不認(rèn)識(shí)
?如何辦呢?
首先找到頭文件
發(fā)現(xiàn)都運(yùn)行不了?
?然后給他加上權(quán)限
解決方法
你會(huì)發(fā)現(xiàn)提示不一樣了
剛才是這個(gè)文件找不到,現(xiàn)在是文件找到了,但是有問題
他的問題,跟我們?cè)跇漭上旅孢\(yùn)行demo2.c 一樣的
不認(rèn)識(shí)這些函數(shù)
?如何解決呢?
?同樣的我們?cè)趌inux 下面試一下
報(bào)錯(cuò)了
?因?yàn)槲覀兊逆準(zhǔn)桥艿饺ユ溗?/p>
ls /usr/local/lib/
?我們?nèi)タ匆幌滤奈募傩?/p>
他是個(gè)軟鏈接看不了
?要看他真正鏈的東西
這東西是x86的
arm-linux-gnueabihf-gcc是交叉編譯工具鏈,編譯的東西要適合樹莓派的,你用的window的東西,用的是x86的東西,平臺(tái)不兼容,你的編譯器不認(rèn)識(shí)wiringPi這個(gè)庫
?它編譯出來的庫都是適合x86平臺(tái)的不是樹莓派平臺(tái)的
grep gcc * -nir
grep? ?在所有的文件中匹配gcc的字段
* ????????代表所有的文件
n???????? 顯示行號(hào)(常規(guī)文件顯示行號(hào))
i ?????????是不區(qū)分大小寫
r? ? ? ? 是遞歸,一個(gè)個(gè)目錄的找進(jìn)去
?
給history 加一個(gè)管道 找數(shù)據(jù)源
敲過的指令和demo2有關(guān)的就過濾出來了
?樹莓派的wiringPi庫在哪呢?
?看見鍵號(hào)了嗎?
->是軟鏈接的意思,真正用到的庫是.2.50
?然后我們可以scp把需要的庫傳到linux上面
傳的沒有Dev的那個(gè)
?看看linux是否拿到手了
這個(gè)庫到手了
沒有Dev
?那我們能不能把軟鏈接也拿過來
?看看樹莓派拿到軟鏈接了嗎?
是的
軟連接消失了.so 不會(huì)指向.so.2.50?
?
?這種方式不行,我們要自己創(chuàng)建軟鏈接
如何生成軟鏈接?
ln -s 輸入你要鏈接的文件
?然后我們ls -l 查看一下
有一個(gè)箭頭箭過來,說明創(chuàng)建成功
記得創(chuàng)建一個(gè)不帶Dev的
?軟鏈接已經(jīng)創(chuàng)建成功,可以用了
. L 用當(dāng)前文件庫
記得看看路徑對(duì)不對(duì)
(記得看看鏈接的庫,我傳輸錯(cuò)了,好久才找到原因,對(duì)慘痛教訓(xùn),看見那個(gè)屁股帶Dev的了嗎?那個(gè)就是傳輸錯(cuò)的)
?然后給他個(gè)名字
然后把他傳到樹莓派下面
?
?然后我們?nèi)漭上旅婵匆谎?/p>
?可以正常運(yùn)行
?我們?nèi)ゴa看看,回憶回憶
?功能是吧gpio繼電器7的端口,輸入1 的時(shí)候是低電平,輸入0的時(shí)候是高電平
?然后我們看看初始的時(shí)候
?端口7是1
?當(dāng)我們輸入0的時(shí)候
?當(dāng)我們輸入1的時(shí)候
端口7就變成了0
總結(jié)
以上是生活随笔為你收集整理的树莓派:交叉编译,以及带wiringPi库的如何交叉编译的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国家有没有要求加油站旁边要设置防撞栏?
- 下一篇: linux:安装ubuntu18-04