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
    【64位系统】

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

    请注意PATH代表环境变量,:冒号代表追加。
    保存并退出文件,接着执行以下指令以便立即更新当前控制台所包含的环境变量。

    source .bashrc

【4】简单测试

    为了测试交叉工具链是否安装成功,可在控制台中输入

    arm-linux-gnueabihf-gcc -v
    控制台中输出内容如下,次步骤可证明交叉工具链安装完成且环境变量设置无误。

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

2.简单的例子

    编写一个测试文件,在PC机上完成编译然后通过FTP上传到树莓派中并执行。

    【测试代码】
    文件名为hello-world.c,该例子仅测试交叉编译是否成功并简单测试了浮点数功能。

[cpp] view plaincopy
  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-linux-gnueabihf-gcc hello-world.c -o hello-world
    最终可在hello-world.c的同目录中生成hello-world可执行文件。
    【交叉编译——makefile】

    当然也可在该目录下建立makefile文件,简单的makefile文件如下

[plain] view plaincopy
  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.总结

    最近也时工作需要重新学习了交叉工具链的安装和使用。网上阅读了很多关于树莓派交叉工具链的资料,反复尝试总是出现问题,可能为树莓派版本和交叉工具链版本差异产生的问题。希望这篇博文可以帮助各位,如果存在问题请留言。

树莓派学习笔记——交叉编译工具链相关推荐

  1. 方舟编译器只能编译Java_方舟编译器学习笔记8 工具链可运行(helloworld编译成功)...

    前面的文章 方舟可执行文件简介和 对java2jar及方舟工具链的进一步分析 对工具链中的可执行文件以及测试用例的编译都进行了分析,并对java2jar进行了修改,保证了其可运行.但是后续的jbc2m ...

  2. 交叉编译及树莓派(或其他平台)交叉编译工具链的安装

    交叉编译是什么: 交叉编译是一个行为,是在一个平台上生成另一个平台上的可执行代码. 比如:我们在windows上面编写C51的代码,并编译成可执行代码,如xx.hex,是在C51上面运行不是在wind ...

  3. 树莓派 交叉编译工具链的安装

    1.交叉编译是什么: 2.为什么要交叉编译? 3.交叉编译需要用到什么工具? 4..交叉编译工具链的安装 4.1临时有效 4.2永久有效 安装流程: 1.用file Zilla将tools-maste ...

  4. Mastering Embedded Linux Programming 学习 (一)嵌入式交叉编译工具链的构建,基于crosstool-NG

    Mastering Embedded Linux Programming 学习 (一) 一.ubuntu 软件包下载 sudo apt install autoconf automake bison ...

  5. 采用arm-none-eabi-gcc交叉编译工具链 以及使用xmake构建 STM32 RT-Thread nano工程 笔记

    xmake构建工程 由于多余的文件目录太多,所以删除了bsp目录 xmake.lua构建文件编写 -- 设置工程名 set_project("stm32_rtt_nano_demo" ...

  6. 树莓派学习笔记——GPIO功能学习

    0.前言 树莓派现在越来越火,网上树莓派的资料也越来越多.树莓派源自英国,国外嵌入式开源领域具有良好的分享精神,树莓派各种集成库也层出不穷,下面推荐几个. [ python GPIO ] [开发语言] ...

  7. 【树莓派学习笔记】树莓派4B上运行uboot并从网络启动linux内核(上)

    [树莓派学习笔记]树莓派4B上运行uboot并从网络启动linux内核(上) 文章目录 [树莓派学习笔记]树莓派4B上运行uboot并从网络启动linux内核(上) 前言 1. 硬件需求与软件版本汇总 ...

  8. arm hisiv100 linux,hisiv100交叉编译工具链安装

    hisi交叉编译工具链安装 一.         摘要: 交叉编译简单的说,就是A机器上编译生成,运行在B机器上.那么在A机器上的编译工具安装,就是本文所要描述的内容. 工欲善其事必先利其器,所以交叉 ...

  9. 制定交叉编译工具_交叉编译工具链的制作

    交叉编译工具链的制作 前言及准备 本笔记制作的交叉编译工具已通过简单验证,对初次有需求需要搭建交叉工具链有一定的指导意义,制作工具链比较耗时,需做好花费一整天时间的准备. 资料学习链接 linux工具 ...

最新文章

  1. JNI与NDK学习第二篇-----应用篇
  2. 里程碑式成果Faster RCNN复现难?我们试了一下 | 附完整代码
  3. 菜鸟,大牛,教主的区别
  4. python中读取文件内容-Python读取文件内容的三种常用方式及效率比较
  5. 使用diskpart命令修复U盘分区
  6. Ubuntu 14.04 DNS 配置
  7. javaweb学习总结(九):通过Servlet生成验证码图片
  8. 高德地图跟百度地图经纬度互转
  9. #6034. 「雅礼集训 2017 Day2」线段游戏 李超树
  10. div内容过长自动省略号
  11. 如何用命令获知当前是一年中的第多少周和今天是周几
  12. 使用知行之桥® EDI系统对接德州仪器TI
  13. Newtonsoft 转换json
  14. ezcad旋转轴标刻参数_激光打标机软件ezcad中菜单下的地球仪标刻功能介绍及其操作设置...
  15. 基于MATLAB绘制双纵坐标轴图
  16. .NET工具篇(二)—GACUtil
  17. 两团队在《自然》上发布重要抗癌研究成果,消化系统肿瘤或有望治愈...
  18. shader拖尾_【OpenGL编程】拖尾、刀光、剑光、尾焰效果的开发
  19. 【培训实验记录】锐捷SDN交换机和控制器部署
  20. 苹果审核状态为Metadata Rejected下的问题

热门文章

  1. 【Android 逆向】修改运行中的 Android 进程的内存数据 ( 使用 IDA 分析要修改的内存特征 | 根据内存特征搜索修改点 | 修改进程内存 )
  2. 【开发环境】Windows 系统中使用 Makefile 构建脚本编译 C 程序 ( 下载并安装 TDM-GCC 编译器 | 配置环境变量 | 编译 Makefile 程序 )
  3. 【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行原理分析
  4. 【Android RTMP】NV21 图像旋转处理 ( 图像旋转算法 | 后置摄像头顺时针旋转 90 度 | 前置摄像头顺时针旋转 90 度 )
  5. 【Android NDK 开发】Android Studio 使用 CMake 导入静态库 ( CMake 简介 | 构建脚本路径配置 | 引入静态库 | 指定静态库路径 | 链接动态库 )
  6. 【IOS 开发】基本 UI 控件详解 (UIDatePicker | UIPickerView | UIStepper | UIWebView | UIToolBar )
  7. intellijidea课程 intellijidea神器使用技巧 3-1 列操作
  8. mongodb first
  9. Use Excel Pivot Table as a BI tool
  10. ICLR 2019论文接收结果揭晓:24篇oral论文有没有你?