树莓派:交叉编译,以及带wiringPi库的如何交叉编译
1、交叉編譯是什么?為什么要交叉編譯?
????????交叉編譯? 是在一個平臺上生成另一個平臺上的可執行代碼
????????????編譯:在一個平臺上生成該平臺上的可執行代碼?????
???????????????????????
===================交叉編譯是什么?====================
? ? ? ? ? ? ? ? 我們在windows上面編寫c51代碼,并編譯成可執行代碼,如xx.hex,
? ? ? ? ? ? ? ? 是在c51上面運行,不是在windows上面運行?
?????????
????????????????我們在ubuntu 上面編寫樹莓派代碼,并編譯成可執行代碼,如a.out,
? ? ? ? ? ? ? ? 是在樹莓派上面運行,不是在 ubuntu linux上面運行
????????????????????????c51? 交叉編譯發生在keil(集成環境環境上面)
??????????????
================為什么要交叉編譯?====================
? ? ? ? ? ????????平臺上不允許或不能夠安裝我們所需要的編譯器,比如c51
????????????????1、因為目的平臺上的資源匱乏,無法運行我們所需要的編譯器
? ? ? ? ? ? ? ? ? ? ? ? 2、樹莓派是不是就不需要交叉編譯?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 錯。 也要。樹莓派有時又是因為目的平臺還沒有建立,連操作系統都沒有,根本談不上運行什么編譯器!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 操作系統也是代碼,也要編譯!!!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 平臺運行至少需要兩樣東西:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?bootloader(啟動引導代碼) ,以及操作系統核心
? ??
?宿主機(host) :編輯和編譯程序的平臺,一般是基于x86的pc機,通常也被稱為主機
目標機(target):用戶開發的系統,通常都是非x86平臺。host 編譯得到的可執行代碼在target上運行? ? ? ? ? ? ?
簡單來說:我們學習用的pc 機是宿主機,樹莓派是目標機?
===================交叉編譯需要用到工具:===============
? ? ? ? ? ? ? ? 交叉編譯器、交叉編譯工具鏈
======================相關代碼=======================
代碼的編輯
?代碼的編譯
?編譯出來的代碼./a.out可以運行
==============2、交叉編譯工具鏈的安裝===================
(目標機是樹莓派,用的工具鏈就是樹莓派的)
https://github.com/raspberrypi/
?在這個網址安裝
?他的界面是打開是這樣的
?
?點擊這里,tools就是工具鏈的意思
?進去了是這個樣子的
?然后我們點擊克隆
?再點擊
?點擊最下面的
下載完就這樣啦
?解壓
unzip tools-master.zip
2.1臨時有效=======================================
? ? ? ? PATH環境變量
????????????????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 獲得當前環境變量的值
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?
我們打開虛擬機,新建一個文件夾
然后用filezilla傳輸
?再把它放到想要的地方
然后用這個指令解壓
然后用這個指令解壓
然后用這個指令解壓
解壓完成
打開看看里面都有什么?
?這有很多目錄,我們需要的在哪里呢?
?然后在bin 下面綠色的都是可執行文件
我們需要用到的是這個軟鏈接
它實際用到的是后面的東西?
我們取了一個名字指向4.8.3
這個軟鏈接是不占內存的,只是一個符號,指向4.8.3
這兩個是類似的
只是gcc -v? 編譯出來的東西在本電腦上面運行
如果我們要在樹莓派上編譯需要./arm-linux-gnueabihf-gcc -v
?感覺到敲這么多指令是不是很麻煩?怎么辦呢?
我們能不能像gcc 一樣直接識別到呢?
這涉及到環境變量
如何顯示當下的環境變量?
?那么如何配環境變量呢?(臨時環境變量)====================
pwd顯示當面目錄
?export 是配置環境的意思
?然后我們直接回到工作目錄
?
?現在就可以識別啦
?環境變量的臨時配置方式:
你在其他的窗口,不認識
?那么如何配環境變量呢?(永久有效環境變量)=================
?修改隱藏文件
?
?然后再最后一行加入
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
?然后讓他生效
?我們現在打開一個新的窗口試試
可以認識
而且里面的版本號 4.8.3
3、交叉編譯服務客戶端==================================
交叉編譯:
? ? ? ? 檢查下交叉編譯工具對不對:
?????????????????????????arm-linux-gnueabihf-gcc -v
?????????????????????????4.8.3?
????????????????如何交叉編譯?
????????????????arm-linux-gnueabihf-gcc xxx.c -o xxxx
? ? ? ? ? ? ? ? 如何把編譯生成的可執行文件下載到開發板:
????????????????????????scp test_2 pi@192.168.32.209:/home/pi
????????????????
? ? ? ? ? ? ? ? ? ? ? ? scp 是指令
? ? ? ? ? ? ? ? ? ? ? ? test_2 是文件名
? ? ? ? ? ? ? ? ? ? ? ? 開發板用戶名@開發板地址:開發板的絕對路徑
=========================================================================
新建一個test.c的文件
?里面的內容
?給他命名test_1
file 用來查看文件的屬性
executable,可執行的意思
x86-84,只能運行在x86的64位電腦上
你把這個test_1,放在樹莓派上是跑不動的
?那么如何把test.c放在樹莓派底下運行呢?
?我在再來看一下test_2的屬性
可執行的,可以運行在ARM平臺的
我們在linux平臺上先運行一下兩者
test_2不能解析,不能運行,因為我們編出來的要放在樹莓怕下面跑
交叉編譯的作用就產生啦,在x86平臺上編譯,在樹莓派上面使用
?那如何把他拷貝到樹莓派下面呢?
?那樹莓派是否拿到這個代碼了呢?
是的
那我們如何運行呢?
?那我么如果把test_1也放到樹莓派下能運行嗎?
?運行不了,格式錯誤
如果想要上位機編譯的代碼,能在樹莓派上面運行,
前提是交叉編譯過,交叉編譯的工具鏈要對
4、帶wiringPi庫的交叉編譯如何讓進行=======================
?1、正常我們先要交叉編譯wiringPi庫,編譯出的庫適合樹莓派,這時候交叉編譯可執行程序的時候,鏈接庫的格式也是正確的。
2、通過 -I? ? -L? 來指定
?因為鏈接庫的格式不對,是宿主機的平臺,出現以先下錯誤
? ? ? ? ? ? ? ? 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中一個非常重要命令,一定要熟悉。它的功能是為某一個文件在另外一個位置建立一個同不的鏈接,這個命令最常用的參數是-s, 具體用法是:ln -s 源文件 目標文件。 當 我們需要在不同的目錄,用到相同的文件時,我們不需要在每一個需要的目錄下都放一個必須相同的文件,我們只要在某個固定的目錄,放上該文件,然后在其它的 目錄下 用ln命令鏈接 (link)它就可以,不必重復的占用磁盤空間。例如:ln -s /bin/less /usr/local/bin/less -s 是代號(symbolic)的意思。 這 里有兩點要注意:第一,ln命令會保持每一處鏈接文件的同步性,也就是說,不論你改動了哪一處,其它的文件都會發生相同的變化;第二,ln的鏈接又軟鏈接 和硬鏈接 兩種,軟鏈接就是 ln -s ** **,它只會在你選定的位置上生成一個文件的鏡像,不會占用磁盤空間,硬鏈接ln ** **,沒有參數-s, 它會在你選定的位置上生成一個和源文件大小相同的文件,無論是軟鏈接還 是硬鏈接,文件都保持同步變化。【硬連接】
硬連接指通過索引節點來進行連接。在Linux的文件系統中,保存在磁盤分區中的文件不管是什么類型都給它分配一個編號,稱為索引節點號(Inode Index)。在Linux中,多個文件名指向同一索引節點是存在的。一般這種連接就是硬連接。硬連接的作用是允許一個文件擁有多個有效路徑名,這樣用戶就可以建立硬連接到重要文件,以防止“誤刪”的功能。其原因如上所述,因為對應該目錄的索引節點有一個以上的連接。只刪除一個連接并不影響索引節點本身和其它的連接,只有當最后一個連接被刪除后,文件的數據塊及目錄的連接才會被釋放。也就是說,文件真正刪除的條件是與之相關的所有硬連接文件均被刪除。
【軟連接】
另外一種連接稱之為符號連接(Symbolic Link),也叫軟連接。軟鏈接文件有類似于Windows的快捷方式。它實際上是一個特殊的文件。在符號連接中,文件實際上是一個文本文件,其中包含的有另一文件的位置信息。
======================================================================
軟鏈接概念:
1.軟鏈接文件有類似windows的快捷方式。
2.在符號連接中,文件實際上是一個文本文件。其中包含的有另一文件的位置信息。
3.你選定的位置上生成一個文件的鏡像,不會占用磁盤空間
如何生成
? ? ?ln -s libwiringPiDev.so.2.50 libwiringPiDev.so
?
? ? ?????????ln? ?指令
? ? ? ? ? ???-s? ?參數
???????????????? libwiringPiDev.so.2.50要被鏈接的文件
????????????????ibwiringPiDev.so 軟鏈接文件名字
硬鏈接概念:
?????????????????ln? libwiringPiDev.so.2.50? libwiringPiDev.so
? ? ? ? ? ? ? ? 1、他會在你選定的位置上生成一個和源文件大小相同的文件
===========相關代碼================================
在我們之前寫的demo2.c里面
?他的頭文件包含wiringPi.h
?我們如果直接gcc 編譯的話會出現錯誤,顯示不認識這些函數
?必須得鏈接上wiringPI的庫才可以
?如果在上位機進行交叉編譯的時候,我們并沒有wiringPI這個東西,如何辦呢?
下載代碼,在用filezilla傳輸
解壓以后傳輸到Linux下面
傳輸完以后
記得解壓完,看看里面的兩個東西
?然后我們./build輸入一下試試
發現全是白的運行不了,必須是綠的才能運行,這時候
直接用chmod 就行啦
chmod +x 文件名?
?根據README.TXT和INSTALL
?我們先./build
超級用戶需要輸入密碼
然后告訴你安裝完畢
然后我們看看他說的是不是在/usrlocal/lib/下面有
確實有這些東西,但是這些東西是不能用的
我們做個實驗
把樹莓派的demo2.c傳輸到linux 上面
用scp
記得Linux網絡改成橋接模式
?然后我們看看linux 有沒有傳過來的demo2.c
?然后我們編譯它
發現頭文件不認識
?如何辦呢?
首先找到頭文件
發現都運行不了?
?然后給他加上權限
解決方法
你會發現提示不一樣了
剛才是這個文件找不到,現在是文件找到了,但是有問題
他的問題,跟我們在樹莓派下面運行demo2.c 一樣的
不認識這些函數
?如何解決呢?
?同樣的我們在linux 下面試一下
報錯了
?因為我們的鏈是跑到去鏈他的
ls /usr/local/lib/
?我們去看一下他的文件屬性
他是個軟鏈接看不了
?要看他真正鏈的東西
這東西是x86的
arm-linux-gnueabihf-gcc是交叉編譯工具鏈,編譯的東西要適合樹莓派的,你用的window的東西,用的是x86的東西,平臺不兼容,你的編譯器不認識wiringPi這個庫
?它編譯出來的庫都是適合x86平臺的不是樹莓派平臺的
grep gcc * -nir
grep? ?在所有的文件中匹配gcc的字段
* ????????代表所有的文件
n???????? 顯示行號(常規文件顯示行號)
i ?????????是不區分大小寫
r? ? ? ? 是遞歸,一個個目錄的找進去
?
給history 加一個管道 找數據源
敲過的指令和demo2有關的就過濾出來了
?樹莓派的wiringPi庫在哪呢?
?看見鍵號了嗎?
->是軟鏈接的意思,真正用到的庫是.2.50
?然后我們可以scp把需要的庫傳到linux上面
傳的沒有Dev的那個
?看看linux是否拿到手了
這個庫到手了
沒有Dev
?那我們能不能把軟鏈接也拿過來
?看看樹莓派拿到軟鏈接了嗎?
是的
軟連接消失了.so 不會指向.so.2.50?
?
?這種方式不行,我們要自己創建軟鏈接
如何生成軟鏈接?
ln -s 輸入你要鏈接的文件
?然后我們ls -l 查看一下
有一個箭頭箭過來,說明創建成功
記得創建一個不帶Dev的
?軟鏈接已經創建成功,可以用了
. L 用當前文件庫
記得看看路徑對不對
(記得看看鏈接的庫,我傳輸錯了,好久才找到原因,對慘痛教訓,看見那個屁股帶Dev的了嗎?那個就是傳輸錯的)
?然后給他個名字
然后把他傳到樹莓派下面
?
?然后我們去樹莓派下面看一眼
?可以正常運行
?我們去代碼看看,回憶回憶
?功能是吧gpio繼電器7的端口,輸入1 的時候是低電平,輸入0的時候是高電平
?然后我們看看初始的時候
?端口7是1
?當我們輸入0的時候
?當我們輸入1的時候
端口7就變成了0
總結
以上是生活随笔為你收集整理的树莓派:交叉编译,以及带wiringPi库的如何交叉编译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国家有没有要求加油站旁边要设置防撞栏?
- 下一篇: linux:安装ubuntu18-04