树莓派 交叉编译 php,LINUX主机上交叉编译树莓派详细教程

LINUX主机OS:Ubuntu14.04 64位,运行在wmware workstation 10上.

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

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

1.为什么需要交叉编译

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

gcc test.c -o test

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

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

其它平台的交叉编译工具请自行google.

3.安装交叉编译工具

3.1解压

下载完成的文件为tools-master.zip,可以直接右键extract解压,也可以unzip解压到新建的RPI文件夹下, -d用于指定路径为./RPI

mkdir RPI

unzip -d ./RPI tools-master.zip

在RPI文件下tools/arm-bcm2708文件夹下有5个文件夹(不同版本可能略有差别):

20180110203234524389.png

对于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文件结尾添加

#rpi cross compile path

export PATH=$PATH:$HOME/RPI/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

重启使环境变量立即生效

3.3测试

测试是否安装成功,按照网上的方法在终端键入

arm-linux-gnueabihf-gcc -v

报错如下

20180110203234537084.png

在反复确认环境变量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

可以看到安装正常

20180110203234564429.png

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

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

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

hellowd.c如下

#include

int main()

{

printf("hello,world linux\n");

}

指定到hellowd.c路径,并编译,结果报错如下

20180110203234580055.png

根据报错信息,查看路径/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文本文件).

再次编译如下

20180110203234592751.png

问题同上,只需修改ld-linux-armhf.so.3中指定的ld-2.13.so文件的名字为ld-linux-armhf.so.3即可

再次编译已无报错

20180110203234613259.png

在源文件路径下可以看到生成的可执行文件,注意需要copy到树莓派上执行

20180110203234633768.png

5.在树莓派上执行可执行文件

5.1安装filezilla

由于条件限制,树莓派不能联网,也不能使用U盘,只有Ubuntu主机可以上网.之前尝试过在Ubuntu主机安装vsftpd,树莓派ftp 主机ip 来传输文件,结果发现树莓派系统没有安装ftp指令.最终使用filezilla软件实现Ubuntu和树莓派的文件传输.

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

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

uname -a

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

我的64位ubuntu如下

20180110203234653300.png

5.2 copy hellowd可执行文件

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

使用路由器的可以在浏览器上路由器地址里查询树莓派的ip,有显示屏的可以在树莓派上命令行查看ip

ifconfig

至于没有路由器没有显示屏的如何查看树莓派ip,这个有待google

获取到了树莓派的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文件

20180110203234677715.png

5.3执行hellowd

树莓派外接显示屏可以直接cd到hellowd路径,然后./hellowd执行

也可以在PC上通过putty登陆树莓派执行

20180110203234690411.png

默认登录名pi 密码raspberry 密码不会显示,输入完直接回车

20180110203234702130.png

需要改权限使passwd可被树莓派执行,执行如下

20180110203234722638.png

可以看到与程序预期一致,交叉编译成功

参考文献

原文:http://www.cnblogs.com/cursorhu/p/5760415.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
从github.com/raspberrypi/tools完整下载的主分支,直接git太慢还容易失败,特意分享出来,实测在Ubuntu 18上安装x64工具链可用,gcc版本:4.8.3. 文件300M+,不能上传大于220M的,尝试过解压后分卷,会导致安装有问题,所以直接发一个链接,大家去那里下吧。 文件信息: └─tools-master ├─arm-bcm2708 │ ├─arm-bcm2708-linux-gnueabi │ │ ├─arm-bcm2708-linux-gnueabi │ │ │ ├─bin │ │ │ ├─debug-root │ │ │ │ └─usr │ │ │ │ └─bin │ │ │ ├─include │ │ │ │ └─c++ │ │ │ │ └─4.7.1 │ │ │ │ ├─arm-bcm2708-linux-gnueabi │ │ │ │ │ └─bits │ │ │ │ ├─backward │ │ │ │ ├─bits │ │ │ │ ├─debug │ │ │ │ ├─decimal │ │ │ │ ├─ext │ │ │ │ │ └─pb_ds │ │ │ │ │ └─detail │ │ │ │ │ ├─binary_heap_ │ │ │ │ │ ├─binomial_heap_ │ │ │ │ │ ├─binomial_heap_base_ │ │ │ │ │ ├─bin_search_tree_ │ │ │ │ │ ├─branch_policy │ │ │ │ │ ├─cc_hash_table_map_ │ │ │ │ │ ├─eq_fn │ │ │ │ │ ├─gp_hash_table_map_ │ │ │ │ │ ├─hash_fn │ │ │ │ │ ├─left_child_next_sibling_heap_ │ │ │ │ │ ├─list_update_map_ │ │ │ │ │ ├─list_update_policy │ │ │ │ │ ├─ov_tree_map_ │ │ │ │ │ ├─pairing_heap_ │ │ │ │ │ ├─pat_trie_ │ │ │ │ │ ├─rb_tree_map_ │ │ │ │ │ ├─rc_binomial_heap_ │ │ │ │ │ ├─resize_policy │ │ │ │ │ ├─splay_tree_ │ │ │ │ │ ├─thin_heap_ │ │ │ │ │ ├─tree_policy │ │ │ │ │ ├─trie_policy │ │ │ │ │ └─unordered_iterator │ │ │ │ ├─profile │ │ │ │ │ └─impl │ │ │ │ ├─tr1 │ │ │ │ └─tr2 │ │ │ └─sysroot │ │ │ ├─etc │ │ │ ├─lib │ │ │ ├─sbin │ │ │ └─usr │ │ │ ├─bin │ │ │ ├─include │ │ │ │ ├─arpa │ │ │ │ ├─asm │ │ │ │ ├─asm-generic │ │ │ │ ├─bits │ │ │ │ ├─drm │ │ │ │ ├─gnu │ │ │ │ ├─linux │ │ │ │ │ ├─byteorder │ │ │ │ │ ├─caif │ │ │ │ │ ├─can │ │ │ │ │ ├─dvb │ │ │ │ │ ├─hdlc │ │ │ │ │ ├─isdn │ │ │ │ │ ├─mmc │ │ │ │ │ ├─netfilter │ │ │ │ │ │ └─ipset │ │ │ │ │ ├─netfilter_arp │ │ │ │ │ ├─netfilter_bridge │ │ │ │ │ ├─netfilter_ipv4 │ │ │ │ │ ├─netfilter_ipv6 │ │ │ │ │ ├─nfsd │ │ │ │ │ ├─raid │ │ │ │ │ ├─spi │ │ │ │ │ ├─sunrpc │ │ │ │ │ ├─tc_act │ │ │ │ │ ├─tc_ematch │ │ │ │ │ ├─usb │ │ │ │ │ └─wimax │ │ │ │ ├─mtd │ │ │ │ ├─net │ │ │ │ ├─netash │ │ │ │ ├─netatalk │ │ │ │ ├─netax25 │ │ │ │ ├─neteconet │ │ │ │ ├─netinet │ │ │ │ ├─netipx │ │ │ │ ├─netiucv │ │ │ │ ├─netpacket │ │ │ │ ├─netrom │ │ │ │ ├─netrose │ │ │ │ ├─nfs │ │ │ │ ├─protocols │ │ │ │ ├─rdma │ │ │ │ ├─rpc │ │ │ │ ├─rpcsvc │ │ │ │ ├─scsi │ │ │ │ │ └─fc │ │ │ │ ├─sound │ │ │ │ ├─sys │ │ │ │ ├─video │ │ │ │ └─xen │ │ │ ├─lib │ │ │ │ └─gconv │ │ │ ├─libexec │ │ │ ├─sbin │ │ │ └─share │ │ │ ├─i18n │ │ │ │ ├─charmaps │ │ │ │ └─locales │ │ │ └─locale │ │ │ ├─be │ │ │ │ └─LC_MESSAGES │ │ │ ├─bg │ │ │ │ └─LC_MESSAGES │ │ │ ├─ca │ │ │ │ └─LC_MESSAGES │ │ │ ├─cs │ │ │ │ └─LC_MESSAGES │ │ │ ├─da │ │ │ │ └─LC_MESSAGES │ │ │ ├─de │ │ │ │ └─LC_MESSAGES │ │ │ ├─el │ │ │ │ └─LC_MESSAGES │ │ │ ├─en_GB │ │ │ │ └─LC_MESSAGES │ │ │ ├─es │ │ │ │ └─LC_

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值