(三)树莓派交叉编译环境配置

0.前言

【1】为什么要使用交叉编译
    交叉编译工具较快开发的速度。树莓派中已经安装了gcc工具链,可在树莓派中直接编译源代码生成可执行文件。于此同时,PC机上也可使用gcc工具链生成可执行代码,但是和树莓派上的gcc工具不同,PC机上的gcc工具生成intel或amd芯片上可执行的代码,但树莓派却是arm系列的芯片,显然存在不小的差异。那么使用交叉工具链便可在PC机上开发树莓派中可执行程序。
    虽然树莓派的主频可达700MHz远高于一般的嵌入式系统,但相比于PC机其性能还是差些,使用交叉工具链可节约开发时间。在编译链接同等规模的代码时,PC机所用的时间应少于树莓派所用时间,通过交叉编译的方法提高效率。

【2】PC机环境 ubuntu 14.04 amd64
    请注意32位系统和64位系统存在差异,请注意博文中相关章节的描述。本文的程序在ubunut 14.04 amd64系统,lubuntu 14.04 i386系统中测试通过(硬盘安装,非虚拟机环境)。

1.设置交叉工具链

【1】下载必要的软件和工具
    sudo apt-get install build-essential git

【2】clone交叉工具链
    在home路径下建立一个文件夹取名为rpi
    mkdir rpi
    进入该目录并执行clone操作(更正一处错误)
    cd rpi
    git clone git://github.com/raspberrypi/tools.git

    请注意clone的时间较长请耐心等待。clone完成之后可进入以下目录查看工具链的具体内容。
    cd ~/rpi/tools/arm-bcm2708/

    【特别提醒】
    克隆完成之后可以通过pull更新tools
    cd ~/rpi/tools
    git pull origin

    该目录中存在4个文件夹,本例使用gcc-linaro-arm-linux-gnueabihf-raspbian 或 gcc-linaro-arm-linux-gnueabihf-raspbian-x64。前者对应32位系统后者对应64位系统。
    arm-bcm2708hardfp-linux-gnueabi  
    gcc-linaro-arm-linux-gnueabihf-raspbian
    arm-bcm2708-linux-gnueabi        
    gcc-linaro-arm-linux-gnueabihf-raspbian-x64

【3】加入环境环境变量
    在/.bashrc文件中加入gcc交叉工具链目录。
    sudo gedit ~/.bashrc
    在该文件最后加入交叉工具链所在目录。请注意~符号表示HOME路径,.bashrc为隐藏文件。
    【32位系统】
    export PATH=$PATH:$HOME/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin(gcc有问题,暂不明)
    export PATH=$PATH:$HOME/rpi/tools/arm-bcm2708-linux-gnueabi/bin(使用这个文件中的gcc)
    【64位系统】
    export PATH=$PATH:$HOME/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
    export PATH=$PATH:$HOME/rpi/tools/arm-bcm2708-linux-gnueabi/bin
    请注意PATH代表环境变量,:冒号代表追加。
    保存并退出文件,接着执行以下指令以便立即更新当前控制台所包含的环境变量。
    source .bashrc

【4】简单测试
    为了测试交叉工具链是否安装成功,可在控制台中输入
    arm-bcm2708-linux-gnueabi-gcc -v
    控制台中输出内容如下,次步骤可证明交叉工具链安装完成且环境变量设置无误。

图1 arm-linux-gnueabihf-gcc版本信息

2.简单的例子

    编写一个测试文件,在PC机上完成编译然后通过FTP上传到树莓派中并执行。
    【测试代码】
    文件名为hello-world.c,该例子仅测试交叉编译是否成功并简单测试了浮点数功能。
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. int main(void)  
  3. {  
  4.     float pi = 3.14;      
  5.     printf("Hello World\n");  
  6.     printf("%.2f\n",2*pi);  
  7. }  

    【交叉编译——简单指令】
    cd进入hello-world.c所在目录,输入以下指令以生成可执行文件。请注意该可执行文件不能在PC机上运行。
    arm-bcm2708-linux-gnueabi-gcc hello-world.c -o hello-world
    最终可在hello-world.c的同目录中生成hello-world可执行文件。

    【交叉编译——makefile】
    当然也可在该目录下建立makefile文件,简单的makefile文件如下
[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. CC=arm-linux-gnueabihf-gcc  
  2. hello-world:hello-world.o  
  3. clean:  
  4.     rm -rf hello-world.o hello-world  

    在makefile文件中使用了至少两条隐含规则,CC为默认工具链;*.o文件由同名的*.c文件生成。
    那么在控制台中输入make即可生成可执行文件。

    【FTP上传】
    可在ubuntu中安装filezilla软件,该软件具有ubuntu版本可通过ubuntu软件中心直接安装。ubuntu版本和windows使用方法相同。

图2 使用FileZilla上传文件

    【SSH登陆执行】
    假设raspberry的IP地址为192.168.1.107,可使用以下指令登陆raspberry
    ssh pi@192.168.1.107
    登陆之后进入可执行文件所在目录,修改该文件的执行权限。
    sudo chmod 755 hello-world
    该文件的所有者为pi,所有者pi对于该可执行文件具有可写可读可执行权限(7),755中的后两个55为可读与可执行,本例中对于hello-world用处不大。
    输入以下指令便可运行该文件
    ./hello-world
    控制台输出结果,至此可完全证明交叉工具链工作正常。

图3 树莓派中执行结果

3.总结

    本文由http://blog.csdn.net/xukai871105/article/details/24932611博文修改而来,当时使用原文中的方面进行环境搭建,最后一直出现segmentation fault。
    以下为修改过的内容环境变量中多添加一句export PATH=$PATH:$HOME/rpi/tools/arm-bcm2708-linux-gnueabi/bin
    编译c文件时不再用arm-linux-gnueabihf-gcc,而改用arm-bcm2708-linux-gnueabi-gcc进行编译
    最终在PI上运行良好。
从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、付费专栏及课程。

余额充值