#创作者激励#aarch64-linux-gnu-gcc交叉编译使用教程 原创

落叶亦知冬
发布于 2023-3-6 17:31
浏览
1收藏

【文正在参加2023年第一期优质创作者激励计划】

前言

对于许多初学者来讲,鸿蒙系统的编译可谓是“天长地久”,一个标准系统的编译可能就要花上一个多小时甚至整个下午的编译时间。我遇到了许多开发者甚至是我,有一段时间,每次编译程序都会hb set,hb build,每次都是将整个系统编译一次,花费时间巨大。那我们是否可以单独编译我们写的程序,将其链接成一个可执行文件,再用工具发送到开发板上使用呢。其实是可以的,不过存在一个问题就是,我们在自己虚拟机上编译好的可执行文件在开发板中执行不了,这是因为我们的虚拟机和开发板的系统架构不同。所以这里我将向大家介绍交叉编译

本次将会使用到开源鸿蒙源码中prebuilts自带的aarch64-linux-gnu-gcc交叉编译工具链。动手能力强的伙伴也可以自行下载,配好环境变量方便使用。

什么是交叉编译?

通常,在嵌入式开发过程中,生产环境的系统架构与产品的系统架构不同,所以我们在生产环境中编译出来的可执行文件在产品中是无法执行的,简单来讲就是,我们写代码的linux编出来的东西,板子上的linux识别不了,无法运行。而且考虑到在许多产品平台编译需要较强的CPU运算能力,所以我们可以在我们的电脑上将可执行文件编译成适配产品中系统架构的文件模式。这便是交叉编译。
::: hljs-center

#创作者激励#aarch64-linux-gnu-gcc交叉编译使用教程-开源基础软件社区

:::

为什么是aarch64-linux-gnu-gcc?

由于本人在此案例使用到的板子是九联科技的union_tiger的板子,其系统架构是aarch64,所以对其使用相应的编译工具链进行编译才能在板子上使用。

查看系统架构的命令
uname -m
使用debug接口或者hdc_std进入文件系统输入指令uname -m便可查看
::: hljs-center

#创作者激励#aarch64-linux-gnu-gcc交叉编译使用教程-开源基础软件社区

:::

同理,在我们用来写代码的Linux中使用该命令将会看到我们的架构一般是x86_64的。
板子系统是其他架构的需要使用相对应的工具链进行编译开发

hdc_std简单介绍

首先hdc全称是HarmonyOS Device Connector,是HarmonyOS鸿蒙北向开发人员的命令行调试工具,而hdc_std是提供给OpenHarmony鸿蒙南向使用的命令行调试工具,std表示的意思是standard。所以是在鸿蒙系统标准版的调试工具。详细可在社区搜索hdc_std查看。
::: hljs-center

#创作者激励#aarch64-linux-gnu-gcc交叉编译使用教程-开源基础软件社区

:::

如果使用过devEco在其Sdk8中的toolchains中有该工具

在这里的作用就是将编译完成的可执行文件发送到板子上供板子使用。
这里我们需要使用几个简单的命令。

//以读写权限重新挂载文件系统 !!!命令包括后面的斜杠/
hdc_std shell mount -o remount,rw /
//发送本地文件到板子上
hdc_std file send [本地文件路径] [系统文件目标路径]
//进入文件系统
hdc_std shell

使用教程

aarch64-linux-gnu-gcc类似这种交叉编译工具链使用方法其实和gcc大同小异。
流程也都是一样的,预处理、编译、汇编、链接。在这里就不再赘述了。

  1. 创建GoodAfternoon.c文件(也可以是HelloWorld.c啦)
#include<stdio.h>
int main(int argc,char** argv)
{
        printf("Good afternoon !\n");
        return 0;
}
  1. 执行命令

~/OpenHarmony-3.2-Beta5/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc GoodAfternoon.c -o GoodAfternoon -static
::: hljs-center

#创作者激励#aarch64-linux-gnu-gcc交叉编译使用教程-开源基础软件社区

:::
由于这里我是直接使用了源码中prebuilts中的工具链,才会使该命令看起来冗余繁琐,若配置好环境变量,可以直接使用以下命令

aarch64-linux-gnu-gcc GoodAfternoon.c -o GoodAfternoon -static
此处的-static是生产静态可执行文件,否则的话需要向开发板移入其它文件。

  1. 此时便可以看到当前文件夹生成了一个可执行文件GoodAfternoon,这一步便需要到刚才介绍的hdc_std工具了。将可执行文件GoodAfternoon下载到本地。连接板子的OTG口(!!!注意hdc_std使用的不是debug口
    ::: hljs-center

#创作者激励#aarch64-linux-gnu-gcc交叉编译使用教程-开源基础软件社区

:::
4. 依次使用命令

hdc_std shell mount -o remount,rw /
hdc_std file send GoodAfternoon /system/bin
::: hljs-center

#创作者激励#aarch64-linux-gnu-gcc交叉编译使用教程-开源基础软件社区

:::

  1. 最后进入文件系统 执行GoodAfternoon如果提示权限问题,直接更改文件权限就行。

hdc_std shell
#GoodAfternoon
#Good afternoon !
::: hljs-center

#创作者激励#aarch64-linux-gnu-gcc交叉编译使用教程-开源基础软件社区

:::

至此,表示交叉编译成功。

总结

交叉编译解决了我们不同系统架构开发的问题,使得我们更加方便进行开发和学习。通过学习更多的编译工具如makefile,ninja等,将诸多工具合理使用,便可以为我们的嵌入式开发带来更多的便利。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2023-3-6 17:31:10修改
2
收藏 1
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐