make 是一个标准的 Unix 构建工具,用于自动化编译过程。它读取 Makefile 中的规则和依赖项并根据这些规则来构建源代码。make 会检查源代码文件的时间戳,以确定哪些文件需要重新编译。它会自动解决依赖关系并按正确的顺序编译源文件。通过在终端中运行 make 命令,make 将根据 Makefile 中的指令逐步构建代码,生成最终的可执行程序或库文件。
直接通过make方式构建的三方库,其原库的Makefie文件已固定,因此如果需要交叉编译此类三方库,需要先分析原库的Makefile文件,查看其编译工具的具体配置方式。
本文通过bzip2三方库来分享如何通过OpenHarmony SDK在linux环境来交叉编译make构建方式的三方库。
编译前准备
OHOS SDK准备
-
从 openHarmony SDK 官方发布渠道 下载SDK
-
解压SDK
owner@ubuntu:~/workspace$ tar -zxvf version-Master_Version-OpenHarmony_3.2.10.3-20230105_163913-ohos-sdk-full.tar.gz
-
进入到sdk的linux目录,解压工具(C/C++三方库主要使用到native工具)
owner@ubuntu:~/workspace$ cd ohos_sdk/linux owner@ubuntu:~/workspace/ohos-sdk/linux$ for i in *.zip;do unzip ${i};done owner@ubuntu:~/workspace/ohos-sdk/linux$ ls ets native toolchains ets-linux-x64-4.0.1.2-Canary1.zip native-linux-x64-4.0.1.2-Canary1.zip toolchains-linux-x64-4.0.1.2-Canary1.zip js previewer js-linux-x64-4.0.1.2-Canary1.zip previewer-linux-x64-4.0.1.2-Canary1.zip
三方库源码准备
-
下载三方库代码:
下载bzip2 v1.0.6版本的源码包
owner@ubuntu:~/workspace$ wget https://sourceforge.net/projects/bzip2/files/bzip2-1.0.6.tar.gz ## 下载指定版本的源码包
-
解压源码包
owner@ubuntu:~/workspace$ tar -zxf bzip2-1.0.6.tar.gz ## 解压源码包 owner@ubuntu:~/workspace$ owner@ubuntu:~/workspace$ cd bzip2-1.0.6/ # 进入到bzip2源码目录 owner@ubuntu:~/workspace/bzip2-1.0.6$
编译&安装
-
分析Makefile文件
通过分析原库的Makefile文件可知其以下几个内容需要进行重新配置
- 编译命令配置
# To assist in cross-compiling CC=gcc AR=ar RANLIB=ranlib LDFLAGS=
默认配置linux下gcc的编译命令,编译时我们需要配置成OpenHarmony交叉编译命令即可。
- 安装路径配置
# Where you want it installed when you do 'make install' PREFIX=/usr/local
默认配置的安装目录为系统的/usr/local/下,如果需要执行安装的话,需配置成用户目录下。
-
配置交叉编译命令,执行交叉编译
分析完Makefile后即可配置交叉编译命令进行编译
owner@ubuntu:~/workspace/bzip2-1.0.6$ make CC="/home/owner/workspace/ohos-sdk/linux/native/llvm/bin/clang --target=aarch64-linux-ohos" AR=/home/owner/workspace/ohos-sdk/linux/native/llvm/bin/llvm-ar RANDLIB=/home/owner/workspace/ohos-sdk/linux/native/llvm/bin/llvm-ranlib -j4 libbz2.a bzip2 bzip2recover /home/owner/workspace/ohos-sdk/linux/native/llvm/bin/clang --target=aarch64-linux-ohos -Wall -Winline -O2 -g -D_FILE_OFFSET_BITS=64 -c huffman.c /home/owner/workspace/ohos-sdk/linux/native/llvm/bin/clang --target=aarch64-linux-ohos -Wall -Winline -O2 -g -D_FILE_OFFSET_BITS=64 -c crctable.c ... 删除大量make信息 ... /home/owner/workspace/ohos-sdk/linux/native/llvm/bin/llvm-ar cq libbz2.a blocksort.o huffman.o crctable.o randtable.o compress.o decompress.o bzlib.o ranlib libbz2.a 1 warning generated. /home/owner/workspace/ohos-sdk/linux/native/llvm/bin/clang --target=aarch64-linux-ohos -Wall -Winline -O2 -g -D_FILE_OFFSET_BITS=64 -o bzip2 bzip2.o -L. -lbz2 owner@ubuntu:~/workspace/bzip2-1.0.6$
特别说明:CC配置除了配置交叉编译的clang外,还需要配置target的架构,即配置成aarch64位,按此配置编译出来的文件才能在64位设备上运行,如若需要编译32位的文件,则target配置成arm-linux-ohos即可
-
查看编译成功后的文件
owner@ubuntu:~/workspace/bzip2-1.0.6$ file bzip2 # 使用file查看生成的文件属性 bzip2: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-aarch64.so.1, with debug_info, not stripped owner@ubuntu:~/workspace/bzip2-1.0.6$
编译时配置了
aarch64-linux-ohos
,故生成的文件属性为ARM aarch64
,交叉编译成功。 -
执行安装
通过之前分析Makefile知道,在安装时需要配置
PREFIX
这个安装路径的变量:owner@ubuntu:~/workspace/bzip2-1.0.6$ make install PREFIX=/home/owner/workspace/usr/bzip2/ # 执行make install安装 owner@ubuntu:~/workspace/bzip2-1.0.6$ owner@ubuntu:~/workspace/bzip2-1.0.6$ ls /home/owner/workspace/usr/bzip2/ # 查看安装文件 bin include lib man owner@ubuntu:~/workspace/bzip2-1.0.6$
测试
交叉编译完后,该测试验证我们的三方库。为了保证原生库功能完整,我们基于原生库的测试用例进行测试验证。为此,我们需要集成了一套可以在OH环境上进行cmake, ctest等操作的环境,具体请阅读 lycium CItools。
-
测试环境配置,请参考 lycium CItools。
-
准备测试资源
使用原生库的测试用例进行测试,我们为了保证测试时不进行编译操作,我们需要把整个编译的源码作为测试资源包通过hdc工具推送到开发板,且需要保证三方库在开发板的路径与编译时路径一致:
owner@ubuntu:~/workspace$ tar -zcvf bzip2.tar.gz bzip2-1.0.6/ hdc_std file send X:\workspace\bzip2.tar.gz /data/ ## 推送资源到开发板 hdc_std shell ## 进入开发板系统 # mkdir -p /home/owner/ ## 设置与编译时同样的路径 # cd /home/owner/ # ln -s workspace /data/ ## 系统根目录空间有限,建议通过软链接配置路径 # cd workspace # tar -zxf bzip2.tar.gz ## 解压测试资源
-
执行测试
hdc_std shell # cd /home/owner/worspace/bzip2-1.0.6 # make check ## 执行测试命令,以下为测试信息 Doing 6 tests (3 compress, 3 uncompress) ... If there's a problem, things might stop at this point. ./bzip2 -1 < sample1.ref > sample1.rb2 ./bzip2 -2 < sample2.ref > sample2.rb2 ./bzip2 -3 < sample3.ref > sample3.rb2 ./bzip2 -d < sample1.bz2 > sample1.tst ./bzip2 -d < sample2.bz2 > sample2.tst ./bzip2 -ds < sample3.bz2 > sample3.tst cmp sample1.bz2 sample1.rb2 cmp sample2.bz2 sample2.rb2 cmp sample3.bz2 sample3.rb2 cmp sample1.tst sample1.ref cmp sample2.tst sample2.ref cmp sample3.tst sample3.ref ... # echo $? ## 查看测试结果 0
bzip2执行了6条测试用例,且未提示任何错误,说明此库测试成功。当不确定此库是否测试成功时,我们还可以在执行完测试命令后在命令行手动查看测试结果,通过输入 echo $?
,如命令行输出0
表示测试成功,非0
代表测试失败。
最后
有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。
这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。
希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!
如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员,可以直接领取这份资料
获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料
鸿蒙(HarmonyOS NEXT)最新学习路线
-
HarmonOS基础技能
- HarmonOS就业必备技能
- HarmonOS多媒体技术
- 鸿蒙NaPi组件进阶
- HarmonOS高级技能
- 初识HarmonOS内核
- 实战就业级设备开发
有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。
获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料
《鸿蒙 (OpenHarmony)开发入门教学视频》
《鸿蒙生态应用开发V2.0白皮书》
《鸿蒙 (OpenHarmony)开发基础到实战手册》
OpenHarmony北向、南向开发环境搭建
《鸿蒙开发基础》
- ArkTS语言
- 安装DevEco Studio
- 运用你的第一个ArkTS应用
- ArkUI声明式UI开发
- .……
《鸿蒙开发进阶》
- Stage模型入门
- 网络管理
- 数据管理
- 电话服务
- 分布式应用开发
- 通知与窗口管理
- 多媒体技术
- 安全技能
- 任务管理
- WebGL
- 国际化开发
- 应用测试
- DFX面向未来设计
- 鸿蒙系统移植和裁剪定制
- ……
《鸿蒙进阶实战》
- ArkTS实践
- UIAbility应用
- 网络案例
- ……
获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料
总结
总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。