• 树莓派(六)树莓派交叉编译


    嵌入式之路,贵在日常点滴

                                                                    ---阿杰在线送代码

    一、概念

    是什么?

    交叉编译是在一个平台上生成一个平台上的可执行代码

    列子 

    • C51的交叉编译发生在keil的集成环境上,在windows编写C51代码,并编译成可执行代码,如xx.hex,是为了在C51平台运行,而不是在windows运行。
    • 在ubuntu上面编写树莓派的代码,并编译成可执行代码,如a.out,是在树莓派上运行,不是在ubuntu linux上运行

    为什么需要交叉编译?

    虽然已经有了主机编译,但目的平台上不允许或不能够安装我们所需要的编译器。

    有时是因为目的平台上的①资源贫乏,无法运行我们所需要编译器;

    有时又是因为②目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。

    树莓派有时因为目的平台还没有建立,连操作系统都没有,操作系统也是代码,也要编译!也要进行交叉编译。

    平台运行需要两样至少东西:bootloader(启动引导代码)以及操作系统核心 

    在工作中使用的设备基本需要进行交叉编译,设备考虑成本问题资源贫乏,没有编译工具 

    宿主机(host)与目标机(target) 

    • 宿主机:编辑和编译程序的平台,一般是基于X86的PC机。
    • 目标机:用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行。

    需要用到什么工具? 

    交叉编译器、交叉编译工具链 

    二、交叉编译工具链的安装 

    下载

    【tools】>【Code】>【Download Zip】 

    安装 

    ①将压缩包拷贝进虚拟机linux(直接拖入、共享文件夹、filezilla)

    ②解压

    unzip tools-master.zip

    ③进入解压后的文件夹 

    cd tools-master/

    ④进入arm-bcm2708 

    cd arm-bcm2708/

    ⑤进入gcc-linaro-arm-linux-gnueabihf-raspbian-x64 

    cd gcc-linaro-arm-linux-gnueabihf-raspbian-x64/

    ⑥进入bin目录 

    cd bin/

    可以看到有很多的可执行文件(绿色),软链接(蓝色) 

    ls -l查看 

    看到这个软链接实际用的是它所指向的一个可执行文件,软链接不占内存只是一个符号指向了这个位置。 

    ⑦使用 

    ./arm-linux-gnueabihf-gcc -v

    以前使用的gcc是在本电脑上运行,使用软链接的是在树莓派上运行。 

    当要使用这个工具时,“藏”得太深,不方便怎么办?作为环境变量即可。 

    临时解决方法:在本窗口直接添加环境变量 

    • 显示当下的环境变量
    echo $PATH

    可以看到各个路径是以作为分隔符 

    /usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/FriendlyARM/toolschain/4.5.1/bin
    • 复制想要添加为环境变量的路径(pwd后复制)

    • 在冒号后面添加复制的路径
    export PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

    • 再次使用 echo $PATH 查看是否添加成功
    /usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

    已经添加成功。

    这样,在其他路径下也能使用交叉编译的gcc,查看版本号。

    arm-linux-gnueabihf-gcc -v

    不建议使用,换一个窗口就不行了。下面还介绍永久有效的方法。 

    永久有效的方法:修改.bashrc 隐藏文件 

            1、修改工作目录下的.bashrc 隐藏文件,配置命令终端 

    vi /home/CLC/.bashrc

            2、把上面用到的配置环境变量的代码在末尾(shift+g快捷键)加入即可

    export PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

     

            3、使其立即生效(之前没有这步也成功了) 

    source .bashrc

            4、验证

    arm-linux-gnueabihf-gcc -v

    三、交叉编译的使用 

    对比gcc与armgcc 

    • 创建.c文件,使用gcc进行编译,用file ./a.out查看文件信息 

    可在电脑上运行 

    • 使用arm-linux-gnueabihf-gcc进行编译,用file ./a.out查看文件信息 

    可在树莓派运行 

    上位机(VMware)写程序,到树莓派运行 

    检查网络配置

    树莓派与虚拟机的网络必须在同一个网段

    如果不相同,继续执行会出现如下错误。

    在这里插入图片描述可用下面的指令修改虚拟机的ip地址 

    sudo ifconfig eth0 192.168.43.240

    从上位机发送编译后的可执行文件到树莓派工作目录 

    scp a.out pi@192.168.225.10:/home/pi

     后输入密码

    raspberry

    在树莓派中运行即可。

    EG:使用交叉编译,让树莓派作为服务器端,VM作为客户端,对树莓派的文件进行访问。

    把服务端的代码通过交叉编译发送给树莓派,树莓派运行,VM运行客户端连接上即可。

    gcc server.c -o serverInX86

    arm-linux-gnueabihf-gcc client.c -o clientInPI

    从上位机发送编译后的可执行文件到树莓派工作目录  

    scp clientInPI pi@192.168.225.10:/home/pi

    运行结果:

     

  • 相关阅读:
    【missing-semester】The shell
    【iOS开发】(六)react Native 路由嵌套传参与框架原理(完)20240423
    C语言实战项目---贪吃蛇(上)
    Omniverse:开发人员的元宇宙
    OkHttp 根据服务器返回的的过期时间设置缓存
    word文档转html(用于用户服务协议等)
    ModBus TCP/RTU 报文解析
    企业数据备份应该怎么操作?应该知道的四种备份方法
    在T507开发板上移植ubuntu系统
    AlphaFold2源码解析(8)--模型之三维坐标构建
  • 原文地址:https://blog.csdn.net/weixin_50546241/article/details/126339437