【本文正在参加星光计划3.0—夏日挑战赛】

背景

  当前linux系统已经有着比较完善的生态支持,从驱动到对应的上层软件,我们往往只需要下载对应的代码进行编译安装或者使用已有的安装包管理工具通过执行安装命令便可轻易的安装所需的软件,然而,对于openharmony来说这就有一点点痛苦,因为我们想借用当前已有的中间件或者软件。则需要花费很大的代价来进行移植。

前提

  由于受限开发开发环境,当前使用的开发板为:RK3568,openharmony系统为3.2版本。交叉编译工具为arm-linux-musleabi-cross.tgz,本地编译环境为VM + Ubuntu 20.04.3 LTS,下载arm-linux-musleabi-cross.tgz并解压的ubuntu相应的目录。

简易交叉编译

将arm-linux-musleabi-cross.tgz解压到相应目录之后,我们得到一个对应解压目录 1656560772820.png bin目录下面为对应的编译工具。 1656560907576.png 编写一个简易测试demo.

#include <stdio.h>
int main(void)
{
     printf("hello arm!\n");
}

通过执行/data/webrtc_bk/arm-linux-musleabi-cross/bin/arm-linux-musleabi-gcc -o test test.c 便可编译当前用例。生成test执行文件,我们将test移入到rk3568中,执行之后... 1656552123635.png

ninja交叉编译

通过ninja配置build.ninja方式进行交叉编译。当然前提是需要安装好ninja,可以参考网上相关安装连接。其中在当前目录下面配置build.ninja

root@ubuntu:/data/webrtc_bk/test/ninja# cat build.ninja 
cflags = -Wall -Werror
cc = "/data/webrtc_bk/arm-linux-musleabi-cross/bin/arm-linux-musleabi-gcc"
rule cc
  command = $cc -c $cflags -MD -MF $out.d $in -o $out
  description= 编译1 $in 成为 $out
  depfile =${out}.d
  deps=gcc
  
build dome.o: cc test.c
rule link_dome
   command= $cc $defines  $includes $cflags $in -o $out
   description= 连接2 $in 成为 $out
build dome: link_dome dome.o
build all: phony dome
default all

其中CC为指定编译器。通过执行ninja all 便可执行编译。 1656568739434.png 开发板执行结果: 1656552098446.png

gn + ninja交叉编译

通过gn + ninja配置方式进行交叉编译。当然前提是需要安装好ninja和gn,可以参考网上相关安装连接。 gn + ninja编译过程中,执行gn gen -C out时,gn通过当前build目录下对应相关配置,BUILDCONFIG.gn为当前编译环境配置,toolchain目录为当前编译工具链配置。由于当前使用交叉编译。我们将command中的编译器修改为对应交叉编译器。 1656569429045.png 执行gn gen -C out 和 ninja -C out 进行编译 1656569498432.png 开发板执行结果: 1656556660736.png 报错原因:我们采用动态库连接原因,需要将编译中对应的动态库拷贝到开发板中包括生成的动态库, 拷贝之后执行结果: 1656558295752.png

结束

通过上述操作,我们初步了解musl交叉编译,但在实际的开发过程中这往往并不能满足实际开发需求,我们可能需要更为复杂的编译框架,如gn + ninja + clang + 交叉编译库等方式进行(参考webrtc交叉编译)。后续将继续探索更为复杂的编译方式。

附件链接:https://ost.51cto.com/resource/2118

想了解更多关于开源的内容,请访问:

51CTO 开源基础软件社区

https://ost.51cto.com/#bkwz