#冲刺创作新星#[四]移植一个开源库 原创 精华
作者:王石,胡瑞涛
在**《[二]第一个OpenHarmony程序》**里提到了如何在OpenHarmony里开发一个HelloWorld程序,本节我们讨论下如果引用一个开源三方库,引入OpenHarmony编译并在设备上运行。
1. 开源库结构
我们选取比较简单的linux-logo开源库(库地址为:https://github.com/deater/linux_logo),
-
在linux下的运行步骤和结果
-
目录 ls
-
配置 ./configure
-
编译,运行 make&./linux_logo
-
3. 移植到OpenHarmony系统下进行编译运行
移植到OpenHarmony需要在三方库里增加文件夹和gn文件。OpenHarmony里三方库的位置在[代码目录]/third_party位置
我们可以在三方库里创建文件夹:linuxlogo,然后在linuxlogo里创建BUILD.gn文件。接下来我们需要拷贝第三方linuxlog文件到此文件夹内。然后我们需要阅读三方库的Makefile文件。以下是基本的makefile的规则:
-
makefile的规则
-
-
target就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个动作/伪目标/标签(Label),如
clean
。 -
prerequisites就是,要生成那个target所需要的文件或是目标。
-
command也就是make需要执行的命令。(任意的Shell命令)
-
-
-
这是一个文件的依赖关系,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。在定义好依赖关系后,后续的那一行定义了如何生成目标文件的操作系统命令,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。这就是整个make的依赖性。
-
GNU的make工作时的执行步骤如下:(想来其它的make也是类似)
\1. 读入所有的Makefile。
\2. 读入被include的其它Makefile。
\3. 初始化文件中的变量。
\4. 推导隐晦规则,并分析所有规则。
\5. 为所有的目标文件创建依赖关系链。
\6. 根据依赖关系,决定哪些目标要重新生成。
\7. 执行生成命令。
1-5步为第一个阶段,6-7为第二个阶段。第一个阶段中,如果定义的变量被使用了,那么,make会把其展开在使用的位置。但make并不会完全马上展开,如果变量出现在依赖关系的规则中,那么仅当这条依赖被决定要使用了,变量才会在其内部展开。规则包含两个部分,一个是依赖关系,一个是生成目标的方法。
-
查看makefile(内部有一些关键命令的注释)
Makefile
会告诉make
命令做什么(通常是如何编译和链接程序)。
- 进而查看libsysinfo.a静态库下的makefile
- 查看all文件下的makefile
4. 编译开源库
- 在BUILD.gn文件里增加以下内容。可以参考third-party/libuv/BUILD.gn里的内容
- 完成后,这个开源库还需要有一个入口进行加载,在此文章中我们仍然选取graphic的BULID.gn进行依赖添加
同**《[二]编写一个Hello World文件》** 一样
在源码根目录下执行
5. 执行开源库
编译完成后生成的第三方库验证程序linuxlogo使用流程
库文件会输出linuxlogo,路径为:out/rk3568/common/common
6. 结果显示
补充
在此,想说关于程序编译的一些规范和方法,一般来说,C、C++代码要先把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,Linux下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。
- 编译时,是要确定编译目标所需要的源文件。编译器需要的是正确的语法,正确的函数与变量声明。对于后者,通常是需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。
- 链接时,是确定链接的时候需要依赖的额外的库。主要是链接函数和全局变量,所以,可以使用这些中间目标文件来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件,在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包生成库文件,在Windows下是Library File,也就是 .lib 文件;在UNIX下,是Archive File,即为.a文件。
总结就是,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会报警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报Linker Error。
总结
本文主要介绍了在OpenHarmony下如何移植一个开源库,手写一个BUILD.gn、编译运行。
移植完三方库后,通过napi将c、c++接口转换成js接口供应用层调用。作者有了解吗
后面可以写一个文章
👍
期待