Linux上实现树莓派的交叉编译及文件传输,远程登陆
0.环境
Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机
树莓派版本:raspberry pi 2 B型.
树莓派OS:官网下的的raspbian-jessie.
1.为什么需要交叉编译
在Ubuntu上直接编译一个.c源文件可以用系统自带的gcc编译器编译test.c
1 | gcc test .c -o test |
然后执行生成的二进制文件
1 | . /test |
交叉编译就是把编译的过程在LINUX PC(或其它主机)上执行,然后拷贝二进制可执行文件到树莓派(或其它平台)执行
个人理解使用交叉编译主要是速度快和方便debug,如果编译一两个源文件可能PC和树莓派没什么差别,但如果编译内核速度差距就很明显了.
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 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 是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后,例如我的是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里,尽量写绝对路径