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
1gcc
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 2mkdir
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路徑.關於環境變量可以參考修改環境變量的方法
查看環境變量可以用:
1echo
$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到的方法在終端鍵入
1arm-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,而這個文件是可執行文件.可能是為了版本更新的兼容才做這樣的指定處理.
終端執行如下指令
1arm-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 linux\n"
);
}
指定到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位可以用命令
1uname -a
如果出現x86_64是amd64位,出現i686(其它系統可能i386)是32位
我的64位ubuntu如下
5.2 copy hellowd可執行文件
樹莓派和Ubuntu PC分別通過網線連接到交換機(或者路由器),如果樹莓派外接液晶屏可以直接在樹莓派操作,否則可以通過putty軟件在PC遠程登陸樹莓派操作,然而putty需要知道樹莓派的ip地址
使用路由器的可以在浏覽器上路由器地址裡查詢樹莓派的ip
有顯示屏的可以在樹莓派上命令行查看ip
1ifconfig
無顯示屏查看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裡,盡量寫絕對路徑