交叉编译----宿主机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位的树莓派上也一样可以运行起来

相关推荐
云飞云共享云桌面5 分钟前
东莞制造业研发降本方案:1 台云主机承载 10 人 SolidWorks,钣金操作秒响应
linux·运维·服务器·安全·电脑
hanbr12 分钟前
[特殊字符] Linux 学习笔记(二):压缩、Vim 与配置
linux·技术
赛博三把手14 分钟前
实操篇一:Claude Code + Token173 国内直连 Anthropic Fable 5 完整接入教程
linux·编辑器·vim
sbjdhjd14 分钟前
企业级 Tomcat (上):WEB 技术栈 + 架构演进 + 生产级安装部署
linux·运维·云原生·开源·tomcat·云计算·负载均衡
KuaCpp19 分钟前
C++进阶(上)
linux·c++
草莓熊Lotso24 分钟前
【Linux网络】深入理解 TCP 协议(一):报头设计与可靠性基石
linux·运维·服务器·c语言·网络·c++·tcp/ip
风曦Kisaki26 分钟前
#Linux监控与安全Day02:Zabbix 自动发现,Zabbix 报警机制,Zabbix 主动监控,监控 Nginx 服务
linux·运维·nginx·安全·自动化·云计算·zabbix
gis分享者33 分钟前
Linux 网络层 IP 协议与网段划分实战指南
linux·运维·tcp/ip
加油码34 分钟前
Linux 信号详解:从 Ctrl+C 到进程异常退出,真正理解信号机制
linux·服务器·c++
keyipatience41 分钟前
27,28,29进程通信和匿名管道详解
linux·ubuntu·centos