0.环境

Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机

树莓派版本:raspberry pi 2 B型.

树莓派OS:官网下的的raspbian-jessie.

推荐在root用户登录下操作,参考设置root登录

1.为什么需要交叉编译

在Ubuntu上直接编译一个.c源文件可以用系统自带的gcc编译器编译test.c

gcc test.c -o test

然后执行生成的二进制文件

./test

交叉编译就是把编译的过程在LINUX PC(或其它主机)上执行,然后拷贝二进制可执行文件到树莓派(或其它平台)执行 

个人理解使用交叉编译主要是速度快和方便debug,如果编译一两个源文件可能PC和树莓派没什么差别,但如果编译内核速度差距就很明显了.

关于编译的过程参考:http://lxwei.github.io/posts/262.html

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

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路径.关于环境变量可以参考修改环境变量的方法

查看环境变量可以用:

echo $PATH

添加交叉编译工具到环境变量,可以直接在/etc/profile文件结尾添加(也可以在家目录的.bashrc,参考后文更新)

#rpi cross compile path
export PATH=$PATH:$HOME/RPI/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

重启使环境变量立即生效

3.3测试

测试是否安装成功,按google到的方法在终端键入

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,而这个文件是可执行文件.可能是为了版本更新的兼容才做这样的指定处理.

终端执行如下指令

arm-linux-gnueabihf-gcc-4.8.3 -v

可以看到安装正常

4使用交叉编译生成可执行文件

对于单个简单的源文件直接用指令调用交叉编译工具就可以生成二进制文件;对于复杂的多源文件需要编写makefile然后make指令来编译

在这里用命令行编译hellowd.c生成针对树莓派的可执行文件hellowd

hellowd.c如下

#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/

条件允许可以直接在线安装,具体请自行google

查看Ubuntu 是32位还是64位可以用命令

uname -a

如果出现x86_64是amd64位,出现i686(其它系统可能i386)是32位

我的64位ubuntu如下

5.2 copy hellowd可执行文件

树莓派和Ubuntu PC分别通过网线连接到交换机(或者路由器),如果树莓派外接液晶屏可以直接在树莓派操作,否则可以通过putty软件在PC远程登陆树莓派操作,然而putty需要知道树莓派的ip地址

使用路由器的可以在浏览器上路由器地址里查询树莓派的ip

有显示屏的可以在树莓派上命令行查看ip

ifconfig

无显示屏查看ip参考http://www.shumeipaiba.com/wanpai/jiaocheng/17.html

树莓派和PC直连参考http://www.shumeipaiba.com/wanpai/jiaocheng/20.html

获取到了树莓派的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.hertaville.com/development-environment-raspberry-pi-cross-compiler.html

http://blog.csdn.net/xukai871105/article/details/24932611

http://www.cnblogs.com/xieyajie/p/4699724.html

本文允许转载,转载请先声明原文地址http://www.cnblogs.com/cursorhu/p/5760415.html

Linux主机上实现树莓派的交叉编译及文件传输,远程登陆的更多相关文章

  1. Linux主机上使用交叉编译移植u-boot到树莓派

    0环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS: Debian Jes ...

  2. 通过SecureCRT向远程Linux主机上传和下载文件

    有时候直接在Linux服务器上通过 wget 或 curl 工具下截比较大的网络文件时会比较慢,这时我们通常会改用在Windows平台通过迅雷等更加现代化的下载功具下好目标文件(迅雷开会员才能更高速的 ...

  3. 如何在linux主机上运行/调试 arm/mips架构的binary

    如何在linux主机上运行/调试 arm/mips架构的binary 原文链接M4x@10.0.0.55 本文中用于展示的binary分别来自Jarvis OJ上pwn的add,typo两道题 写这篇 ...

  4. 解决Linux主机上的 远程MySQL客户端无法连接的问题

    无法连接到 MySQL 数据库可能的原因有: 1. PHP 无法连接 MySQL 可能是 PHP 配置不正确,没加上连接 MySQL 的功能. 2. MySQL 软件包升级,但没有升级数据库,或安装 ...

  5. Linux入门(1)_VMware和系统分区和系统安装和远程登陆管理

    1 VMware的安装和使用 注意有 快照 和 克隆 的功能. 快照相当于建立一个 系统还原点, 可以随时恢复到原来状态. 克隆功能可以复制一个和当前一样的系统,并可以选择链接安装,只使用很少的空间就 ...

  6. mac上ssh工具,包含简易的文件传输功能

    最近需要在mac上连ssh,但是之前在mac上用的都是简易的SSH Shell,没有找到传输文件的功能. 这时候就非常想念win上的winscp,有个界面,传点东西还是很直观的. 几经搜寻,终于找到一 ...

  7. Linux网络编程:UDP实现可靠的文件传输

    我们知道,用TCP实现文件传输很简单.相对于TCP,因为UDP是面向无连接.不可靠的传输协议,所以我们需要考虑丢包和后发先至(包的顺序)的问题,所以我们想要实现UDP传输文件,则需要解决这两个问题.方 ...

  8. Linux主机上发布java web应用

    1.链接远程主机命令 ssh user@hostname 如: shh root@192.168.1.1 2.查看主机操作系统版本 uname -a 3.linux系统安装mysql a)检查是否安装 ...

  9. Linux学习-Linux 主机上的用户讯息传递

    查询使用者: w, who, last, lastlog 如果你想要知道目前已登入在系统上面的用户呢?可以透过 w 或 who 来查询喔!如下范例所示: [root@study ~]# w 01:49 ...

随机推荐

  1. 使用etree.HTML的编码问题

    title: 使用etree.HTML的编码问题 date: 2015-10-07 17:56:47 categories: [Python] tags: [Python, lxml, Xpath] ...

  2. CoreCRM 开发实录——想用国货不容易

    昨天(2016年12月29日)发了开始开发的文章.本来晚上准备在 Coding.NET 上添加几个任务开始搞起了.可是真的开始用的时候才发现:Coding.NET 的任务功能只针对私有的任务开放.我想 ...

  3. WebApi基于Token和签名的验证

    最近一段时间在学习WebApi,涉及到验证部分的一些知识觉得自己并不是太懂,所以来博客园看了几篇博文,发现一篇讲的特别好的,读了几遍茅塞顿开(都闪开,我要装逼了),刚开始读有些地方不理解,所以想了很久 ...

  4. Android中Fragment的两种创建方式

    fragment是Activity中用户界面的一个行为或者是一部分.你可以在一个单独的Activity上把多个Fragment组合成为一个多区域的UI,并且可以在多个Activity中再使用.你可以认 ...

  5. IOS之Objective-C学习 ARC下的单例模式

    单例模式是我常用的一种设计模式,最常见的用途就是用来保存数据并且传递数据.这都归功于单例模式的特性,首先就让我为大家简单介绍一下单例模式的特性. 单例模式的三大特性: 1.某个类只能有一个实例: 2. ...

  6. EF里Guid类型数据的自增长、时间戳和复杂类型的用法

    通过前两章Lodging和Destination类的演示,大家肯定基本了解Code First是怎么玩的了,本章继续演示一些很实用的东西.文章的开头提示下:提供的demo为了后面演示效果,前面代码有些 ...

  7. C#中实现并发的几种方法的性能测试

    C#中实现并发的几种方法的性能测试 0x00 起因 去年写的一个程序因为需要在局域网发送消息支持一些命令和简单数据的传输,所以写了一个C/S的通信模块.当时的做法很简单,服务端等待链接,有用户接入后开 ...

  8. 几款主流 NoSql 数据库的对比

    最近小组准备启动一个 node 开源项目,从前端亲和力.大数据下的IO性能.可扩展性几点入手挑选了 NoSql 数据库,但具体使用哪一款产品还需要做一次选型. 我们最终把选项范围缩窄在 HBase.R ...

  9. ASP.NET MVC Model元数据(一)

    ASP.NET MVC Model元数据(一) 前言 在我初学的时候对Model元数据的概念很模糊,或者说是在大脑中没有它的一个模型,作为小白的我去看网上的一些文章还是两眼一黑啥都看不明白,然后我想退 ...

  10. 如何用 MEF 扩展应用程序

    最近在写一篇关于如何扩展 Visual Studio 编辑器的文章时,用到了 MEF,因此打算写一篇文章提一下这个技术点.本篇文章并不打算详细介绍 MEF,只是一个最简单的入门,相信您在阅读本篇文章后 ...