交叉编译----宿主机x86 ubuntu 64位-目标机ARMv8 aarch64

1.交叉编译是什么,为什么要交叉编译

  • 编译:在一个平台上生成在该平台上的可执行代码
  • 交叉编译:在一个平台上生成在另一个平台上的可执行代码
  • 交叉编译的例子:如51单片机的可执行代码(hex文件)是在集成环境keil上面编译完成的,我们只需要将编译好的可执行代码下载到51单片机上即可运行
  • 要使用交叉编译的原因:
    (1)目的的平台上的资源贫乏,无法运行或安装我们所需的编译器
    (2)有时因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器
    (3)平台的运行至少需要的两样东西:bootloader(启动引导代码)和操作系统核心,这两样东西也是代码,同样需要进行编译为可执行代码才可运行,而此时原平台根本不支持编译,同样需要在其他平台上编译好可执行代码

2.交叉编译中的基础知识

  • 宿主机(host) :编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。
  • 目标机(target):用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行。
  • 交叉编译需要用到的工具:交叉编译工具链

3.交叉编译工具链

gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar.xz

4.安装交叉编译工具链

  1. 将下载好的压缩包通过ftp文件传输软件传到ubuntu中去,我用的是filezilla软件,这个软件免费好用,直接网上下载即可
  2. 解压压缩包

tar -xvf gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu.tar.xz

得到如下文件夹

  1. 进入到交叉编译工具链的bin目录下

cd gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu/bin

然后查看交叉编译的工具版本看是否安装好

./aarch64-linux-gnu-gcc -v

出现上图所示的版本号后,表示我们此时的交叉编译工具是可以使用了的,但是因为没有配置环境变量,我们此时只能在这个文件夹的bin目录下进行使用,非常不方便,所以要配置环境变量方便使用

  1. 配置环境变量

首先使用

echo $PATH

查看自己的环境变量

将现有的环境变量复制下来

然后用

pwd

查看自己当前所在交叉编译工具链的bin目录的完整路径

将这个目录也复制下来,要将这个目录加入到环境变量中

最后回到回到工作目录,打开.bashrc这个隐藏文件

vi .bashrc

在文件的后面根据自己的交叉编译工具链bin目录的位置加入环境变量,

bash 复制代码
export PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/workspace/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin:/home/CLC/workspace/gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu/bin

接着输入

source /home/CLC/.bashrc

加载配置文件,马上生效配置。

这时在任意目录下输入

aarch64-linux-gnu-gcc -v

显示如下图所示,即表示交叉编译工具链安装完成了

5.交叉编译一个helloworld丢到树莓派上运行

  1. 编写一个test.c的文件
c 复制代码
#include <stdio.h>

int main()
{

        printf("hello world!\n");

        return 0;
}
  1. 交叉编译这个test.c文件

aarch64-linux-gnu-gcc test.c -o helloInArm64

此时如果在x86的平台上运行这个可执行文件就会报错

我们可以用

file helloInArm64

查看这个文件的属性

这里只显示了它是一个64位的可执行文件,但没有显示平台架构,我们将它这个可执行文件放到树莓派等相关的arm架构平台上他就会显示平台的架构

  1. 在树莓派上运行这个交叉编译后的文件
    先使用

file helloInArm64

查看文件属性

这时就会显示平台的架构了

然后直接运行

一个交叉编译的hellworld就运行成功了

一开始我安装的交叉编译工具是arm32位的,编译出来的可执行文件也是32位的,但我放到我64位的树莓派上也一样可以运行起来

相关推荐
yi个名字10 分钟前
Linux文件系统详解:从入门到精通
linux·运维·服务器
Lw老王要学习1 小时前
Linux容器篇、第二章_01Ubuntu22 环境下 KubeSphere 容器平台高可用搭建全流程
linux·运维·服务器·k8s·kubesphere·容器化
張萠飛2 小时前
Linux下如何使用shell脚本导出elasticsearch中某一个index的数据为本地csv文件
linux·运维·elasticsearch
晓枫-迷麟3 小时前
【nano与Vim】常用命令
linux·编辑器·vim
LucienShui4 小时前
Webhook 配置备忘
linux·运维·webhook
超级土豆粉5 小时前
从0到1写一个适用于Node.js的User Agent生成库
linux·ubuntu·node.js
PH_modest5 小时前
【Linux跬步积累】—— 网络编程套接字(二)
linux·运维·网络
CIb0la5 小时前
Ubuntu 25.10 将默认使用 sudo-rs
linux·程序人生·生活
成工小白5 小时前
【Linux】文件操作
linux·运维·服务器
程序员打怪兽6 小时前
基于V4L2摄像头智能识别拍照(人脸和手掌)
linux·嵌入式