2021-05-12 14:32:11
Linux上實現樹莓派的交叉編譯及檔案傳輸,遠端登陸
0.環境
Linux主機OS:Ubuntu14.04 64位元,執行在wmware workstation 10虛擬機器
樹莓派版本:raspberry pi 2 B型.
樹莓派OS:官網下的的raspbian-jessie.
推薦在root使用者登入下操作,參考 Ubuntu 15.04/Ubuntu 15.10開啟root賬戶登入 http://www.linuxidc.com/Linux/2016-03/129183.htm
1.為什麼需要交叉編譯
在Ubuntu上直接編譯一個.c原始檔可以用系統自帶的gcc編譯器編譯test.c
1
|
gcc test .c -o test |
然後執行生成的二進位制檔案
1
|
. /test |
交叉編譯就是把編譯的過程在LINUX PC(或其它主機)上執行,然後拷貝二進位制可執行檔案到樹莓派(或其它平台)執行
個人理解使用交叉編譯主要是速度快和方便debug,如果編譯一兩個原始檔可能PC和樹莓派沒什麼差別,但如果編譯核心速度差距就很明顯了.
關於編譯的過程參考: http://www.linuxidc.com/Linux/2016-09/135473.htm
2.使用什麼交叉編譯工具
交叉編譯工具是針對執行二進位制檔案的平台而選擇,對於樹莓派有專門的交叉編譯工具:https://github.com/raspberrypi/tools,選擇branch:master版本,右側clone or download,點選download zip下載.
也可以直接線上安裝:
sudo apt-get install build-essential git git clone git://github.com/raspberrypi/tools.git
3.安裝交叉編譯工具
3.1解壓
下載完成的檔案為tools-master.zip,可以直接右鍵extract解壓,也可以unzip解壓到新建的RPI資料夾下, -d用於指定路徑為./RPI
1
2
|
mkdir RPI unzip -d . /RPI tools-master.zip |
在RPI檔案下tools/arm-bcm2708資料夾下有5個資料夾(不同版本可能略有差別):
對於32位元的Ubuntu,使用gcc-linaro-arm-linux-gnueabihf-raspbian,對於64位元的使用gcc-linaro-arm-linux-gnueabihf-raspbian-x64.在此選擇64位元上的交叉編譯工具.
3.2新增環境變數
要使用交叉編譯工具需要新增環境變數.環境變數簡單的說就是指定程式的路徑,使程式在終端可以直接執行.比如執行ls指令不需要/bin/ls是因為這個路徑已經新增到了環境變數PATH路徑.關於環境變數可以參考修改環境變數的方法
檢視環境變數可以用:
1
|
echo $PATH |
新增交叉編譯工具到環境變數,可以直接在/etc/profile檔案結尾新增(也可以在家目錄的.bashrc,參考後文更新)
1
2
|
#rpi cross compile path export PATH=$PATH:$HOME /RPI/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin |
重新啟動使環境變數立即生效
3.3測試
測試是否安裝成功,按google到的方法在終端鍵入
1
|
arm-linux-gnueabihf- gcc - v |
報錯如下(如未報錯直接跳第4步)
在反復確認環境變數PATH沒問題後,發現在gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin下有一個arm-linux-gnueabihf-gcc的文字檔案,內容為arm-linux-gnueabihf-gcc-4.8.3,而這個檔案是可執行檔案.可能是為了版本更新的相容才做這樣的指定處理.
終端執行如下指令
1
|
arm-linux-gnueabihf- gcc -4.8.3 - v |
可以看到安裝正常
4使用交叉編譯生成可執行檔案
對於單個簡單的原始檔直接用指令呼叫交叉編譯工具就可以生成二進位制檔案;對於複雜的多原始檔需要編寫makefile然後make指令來編譯
在這裡用命令列編譯hellowd.c生成針對樹莓派的可執行檔案hellowd
hellowd.c如下
1
2
3
4
5
|
#include <stdio.h> int main() { printf ( "hello,world linuxn" ); } |
指定到hellowd.c路徑,並編譯,結果報錯如下(如未報錯直接第5步)
根據報錯資訊,檢視路徑/arm-linux-gnueabihf/libc/lib/arm-linux-gnueabihf/libc.so.6
發現這是個文字檔案,內容為libc-2.13.so 根據之前的經驗,libc.so.6應該是指向libc-2.13.so 而編譯器預設使用libc.so.6 但實際應該使用libc-2.13.so ,只需要把libc-2.13.so重新命名為libc.so.6即可(先備份libc.so.6文字檔案).
再次編譯如下
問題同上,只需修改ld-linux-armhf.so.3中指定的ld-2.13.so檔案的名字為ld-linux-armhf.so.3即可
再次編譯已無報錯
在原始檔路徑下可以看到生成的可執行檔案,注意需要copy到樹莓派上執行
5.在樹莓派上執行可執行檔案
5.1安裝filezilla
由於條件限制,樹莓派不能聯網,也不能使用U盤,只有Ubuntu主機可以上網.之前嘗試過在Ubuntu主機安裝vsftpd,樹莓派ftp 主機ip 來傳輸檔案,結果發現樹莓派系統沒有安裝ftp指令.最終使用filezilla軟體實現Ubuntu和樹莓派的檔案傳輸.
我是使用.deb 安裝,需要手動安裝幾個依賴庫,Ubuntu14.04 64位元的filezilla連結如下https://pkgs.org/ubuntu-14.04/ubuntu-universe-amd64/filezilla_3.7.3-1ubuntu1_amd64.deb/download/
條件允許可以直接線上安裝,Ubuntu 12.10下安裝FileZilla 3.5.3 見 http://www.linuxidc.com/Linux/2012-11/73951.htm
檢視Ubuntu 是32位元還是64位元可以用命令
1
|
uname -a |
如果出現x86_64是amd64位元,出現i686(其它系統可能i386)是32位元
我的64位元ubuntu如下
5.2 copy hellowd可執行檔案
樹莓派和Ubuntu PC分別通過網線連線到交換機(或者路由器),如果樹莓派外接液晶屏可以直接在樹莓派操作,否則可以通過putty軟體在PC遠端登陸樹莓派操作,然而putty需要知道樹莓派的ip地址
使用路由器的可以在瀏覽器上路由器地址裡查詢樹莓派的ip
有顯示屏的可以在樹莓派上命令列檢視ip
1
|
ifconfig |
無顯示屏檢視ip 和 樹莓派和PC直連參考 參考 http://www.linuxidc.com/Linux/2016-09/135472.htm
獲取到了樹莓派的ip後,例如我的是192.168.2.46 可以用filezilla傳輸檔案到樹莓派
Host填樹莓派ip: 192.168.2.46
Username: pi
Password:raspberry (預設的密碼)
Port:22
點選Quickconnect連線成功
右鍵hellowd檔案,add files to queue新增到傳輸佇列
下方傳輸佇列右鍵process queue處理佇列,完成傳輸.重新整理可以看到右側樹莓派已經有hellowd檔案
5.3執行hellowd
樹莓派外接顯示屏可以直接cd到hellowd路徑,然後./hellowd執行
也可以在PC上通過putty登陸樹莓派執行
預設登入名pi 密碼raspberry 密碼不會顯示,輸入完直接回車,輸錯可以backspace刪除
需要改許可權使hellowd可被樹莓派執行,執行如下
可以看到與程式預期一致,交叉編譯成功
在樹莓派液晶屏上終端效果如下:
scrot是一個截圖軟體,可以在樹莓派上截圖,連結:https://packages.debian.org/jessie/scrot
用uname -a檢視樹莓派架構為armhf,安裝相應版本即可.
關於scrot的使用,可以scrot --help檢視
-------------------------------------------------------更新分割線--------------------------------------------------------------------
寫完本文後不久重灌了Ubuntu14.04 64位元,重新設定交叉編譯器並沒有出現本文中交叉編譯器找不到路徑和編譯報錯等情況,但之前的錯誤還是值得記載研究
現在我的交叉編譯工具放在根目錄下,root登入下在家目錄的.bashrc新增交叉編譯器路徑到環境變數
export PATH=$PATH:/RPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
arm-linux-gnueabihf-gcc -v
source之後檢視版本及交叉編譯均正常,測試了分別把路徑寫在/root/.bashrc /root/.profile /et/profile /etc/bash.bashrc都沒有出現之前的錯誤,測試了把新增PATH路徑寫成變數形式$HOME/RPI或者絕對路徑/RPI/ 都正常.
這裡還是推薦把工具放在根目錄下,不要放在HOME(/root)裡,修改環境變數寫在/root的.bashrc裡,盡量寫絕對路徑
本文永久更新連結地址:http://www.linuxidc.com/Linux/2016-09/135471.htm
相關文章