往期鸿蒙全套实战精彩文章必看内容:
简介
Make是一个标准的Unix构建工具,用于自动化编译过程。它可以读取Makefile中的规则和依赖项,并根据这些规则来构建源代码,Make会检查源代码文件的时间戳,以确定哪些文件需要重新编译。Make会自动解决依赖关系并按正确的顺序编译源文件,通过在终端中运行Make命令,Make将根据Makefile中的指令逐步构建代码,生成最终的可执行程序或库文件。
Makefile文件是一个文本文件,它定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,以及哪些文件需要重新编译。这些规则包括文件的编译方式、库文件的创建方法,以及最终生成的可执行文件的制作过程。Makefile文件描述了整个工程的编译、连接等规则,包括源文件的依赖关系和编译顺序。通过编写Makefile文件,开发者可以自动化地构建和管理工程项目,极大地提高了开发效率。
二者关系:
Makefile是Make工具的配置文件,用于描述项目的构建规则和依赖关系。Make工具则根据这些规则和依赖关系,来决定哪些文件需要重新构建,从而实现自动化构建过程。二者共同作用,提高了软件开发的效率和便利性。
Make构建三方库适配流程
本小节介绍如何在Linux环境下,使用Make构建工具通过ohos sdk编译bzip2三方库源码,生成ohos平台三方库的so及二进制文件。
环境准备
- Linux编译环境及HarmonyOS SDK下载请参考:环境准备。
- 获取三方库代码。
owner@ubuntu:/mnt/e/make-makefile$ wget https://sourceforge.net/projects/bzip2/files/bzip2-1.0.6.tar.gz # 下载源码包
- 解压源码包。
owner@ubuntu:/mnt/e/make-makefile$ tar -zxf bzip2-1.0.6.tar.gz # 解压源码包 owner@ubuntu:/mnt/e/make-makefile$ owner@ubuntu:/mnt/e/make-makefile$ cd bzip2-1.0.6/ # 进入到bzip2源码目录 owner@ubuntu:/mnt/e/make-makefile/bzip2-1.0.6$
编译三方库
- 分析Makefile文件。
因为需要适配ohos,所以需要将非ohos的工具链配置为ohos的工具链。
通过分析源库的Makefile文件可知,以下几个内容需要进行重新配置:
- 编译命令配置。
# To assist in cross-compiling CC=gcc AR=ar RANLIB=ranlib
环境变量作用:
- CC:用于指定C语言编译器。
- AR:用于指定归档工具。
- RANLIB:用于指定归档文件的索引命令。
默认配置Linux下gcc的编译命令,编译时需要配置成HarmonyOS交叉编译命令。
- 安装路径配置。
# Where you want it installed when you do 'make install' PREFIX=/usr/local
PREFIX:用于指定安装路径的前缀。
默认配置的安装目录为系统的/usr/local/下,如果需要执行安装的话,需配置成用户目录下。
- 编译命令配置。
- 配置交叉编译命令,执行交叉编译。
分析完Makefile后,即可配置交叉编译命令进行编译(xxx需要改为自己的文件路径)。
owner@ubuntu:/mnt/e/make-makefile/bzip2-1.0.6$ make CC=xxx/ohos-sdk/linux/native/llvm/bin/clang --target=aarch64-linux-ohos AR=xxx/ohos-sdk/linux/native/llvm/bin/llvm-ar RANDLIB=xxx/ohos-sdk/linux/native/llvm/bin/llvm-ranlib -j4 libbz2.a bzip2 bzip2recover xxx/ohos-sdk/linux/native/llvm/bin/clang --target=aarch64-linux-ohos -Wall -Winline -O2 -g -D_FILE_OFFSET_BITS=64 -c huffman.c xxx/ohos-sdk/linux/native/llvm/bin/clang --target=aarch64-linux-ohos -Wall -Winline -O2 -g -D_FILE_OFFSET_BITS=64 -c crctable.c ... # 省略部分make信息 ... xxx/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. xxx/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$
参数说明:
- -j4:指定并行编译的作业数。
- libbz2.a:bzip2压缩库的静态链接库文件,包含了bzip2压缩和解压缩所需的函数和数据结构,供其它程序在链接时使用。
- bzip2:bzip2压缩算法的可执行文件,用于压缩文件或目录。
- bzip2recover:bzip2压缩算法的恢复工具,可以用于恢复由bzip2压缩产生的损坏的压缩文件。
注:CC配置时,除了配置为交叉编译的clang外,还需要配置target的架构,即配置成aarch64位,按此配置编译出来的文件才能在64位设备上运行,如若需要编译32位的文件,则target配置成arm-linux-ohos即可。
- 通过file bzip2查看编译成功后的文件。
owner@ubuntu:/mnt/e/make-makefile/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:/mnt/e/make-makefile/bzip2-1.0.6$
编译时配置了aarch64-linux-ohos,因此生成的文件属性为ARM aarch64,交叉编译成功。
- 执行安装。
通过之前分析Makefile可以知道,在安装时需要配置PREFIX这个安装路径的变量:
owner@ubuntu:/mnt/e/make-makefile/bzip2-1.0.6$ make install PREFIX=xxx/bzip/ # 执行make install安装 if ( test ! -d /mnt/e/make-makefile/bzip2-1.0.6/bzip/bin ) ; then mkdir -p /mnt/e/make-makefile/bzip2-1.0.6/bzip/bin ; fi if ( test ! -d /mnt/e/make-makefile/bzip2-1.0.6/bzip/lib ) ; then mkdir -p /mnt/e/make-makefile/bzip2-1.0.6/bzip/lib ; fi if ( test ! -d /mnt/e/make-makefile/bzip2-1.0.6/bzip/man ) ; then mkdir -p /mnt/e/make-makefile/bzip2-1.0.6/bzip/man ; fi if ( test ! -d /mnt/e/make-makefile/bzip2-1.0.6/bzip/man/man1 ) ; then mkdir -p /mnt/e/make-makefile/bzip2-1.0.6/bzip/man/man1 ; fi if ( test ! -d /mnt/e/make-makefile/bzip2-1.0.6/bzip/include ) ; then mkdir -p /mnt/e/make-makefile/bzip2-1.0.6/bzip/include ; fi ... # 省略部分make install信息 ... cp -f bzgrep.1 bzmore.1 bzdiff.1 /mnt/e/make-makefile/bzip2-1.0.6/bzip/man/man1 chmod a+r /mnt/e/make-makefile/bzip2-1.0.6/bzip/man/man1/bzgrep.1 chmod a+r /mnt/e/make-makefile/bzip2-1.0.6/bzip/man/man1/bzmore.1 chmod a+r /mnt/e/make-makefile/bzip2-1.0.6/bzip/man/man1/bzdiff.1 echo ".so man1/bzgrep.1" > /mnt/e/make-makefile/bzip2-1.0.6/bzip/man/man1/bzegrep.1 echo ".so man1/bzgrep.1" > /mnt/e/make-makefile/bzip2-1.0.6/bzip/man/man1/bzfgrep.1 echo ".so man1/bzmore.1" > /mnt/e/make-makefile/bzip2-1.0.6/bzip/man/man1/bzless.1 echo ".so man1/bzdiff.1" > /mnt/e/make-makefile/bzip2-1.0.6/bzip/man/man1/bzcmp.1
owner@ubuntu:/mnt/e/make-makefile/bzip2-1.0.6$ ls xxx/bzip/ # 查看安装文件 bin include lib man
测试验证
- 测试环境配置,请参考:搭建ohos测试环境。
- 准备测试资源。
同样的,为保证测试时不进行编译操作,把整个编译的源码作为测试资源包通过hdc工具推送到开发板,且需要保证三方库在开发板的路径与编译时路径一致:
owner@ubuntu:/mnt/e/make-makefile$ tar -zcvf bzip2-1.0.6.tar.gz bzip2-1.0.6/ hdc file send xxx/bzipbzip2-1.0.6.tar.gz /data/ # 推送资源到开发板 hdc shell # 进入开发板系统 # mkdir -p /mnt/e # 设置与编译时同样的路径 # cd /mnt/e # ln -s /data/bzip2-1.0.6 ./make-makefile # 系统根目录空间有限,建议通过软链接配置路径 # cd make-makefile # tar -zxf bzipbzip2-1.0.6.tar.gz # 解压测试资源
- 执行测试。
# 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 ...
bzip2执行了6条测试用例,且未提示任何错误,说明此库测试成功。
当不确定此库是否测试成功时,开发者还可以在执行完测试命令后,在命令行通过输入“echo $?”手动查看测试结果:
- 输出0:表示测试成功。
- 非0:表示测试失败。
看完三件事❤️
- 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
- 关注作者 ,不定期分享原创知识。
- 同时可以期待后续文章ing🚀。