GHOST系统之家 - Windows系统光盘下载网站!
当前位置:GHOST系统之家>系统教程 > 跟着小白一起学鸿蒙 [四]移植一个开源库-鸿蒙移植教程

跟着小白一起学鸿蒙 [四]移植一个开源库-鸿蒙移植教程

来源:Ghost系统之家浏览:时间:2023-04-14 07:29:52

跟着小白一起学鸿蒙 [四]移植一个开源库

作者:左翼风发 2022-09-28 13:57:41系统 OpenHarmony 本文主要介绍了在开源鸿蒙下如何移植一个开源库,手写一个BUILD.gn、编译运行。

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

​​51CTO开源基础软件社区​​

​​https://ost.51cto.com​​

本节我们讨论下如果引用一个开源三方库,引入OpenHarmony编译并在设备上运行。

1、开源库结构

我们选取比较简单的linux-logo开源库(库地址为:https://github.com/deater/linux_logo)。

.├── configure├── contrib├── libsysinfo-0.3.0├── linux_logo.c├── LINUX_LOGO.FAQ├── linux_logo.h├── ll_asm├── load_logo.c├── load_logo.h├── load_logos.h├── logo_config├── logo_config.BSD├── logo_config.Irix├── logo_config.Solaris├── logos├── logo_types.h├── parse_logos├── parse_logos.c├── po├── tests

2、在linux下的运行步骤和结果

目录 ls

#冲刺创作新星# #跟着小白一起学鸿蒙# [四]移植一个开源库-开源基础软件社区

配置 ./configure

#冲刺创作新星# #跟着小白一起学鸿蒙# [四]移植一个开源库-开源基础软件社区

编译,运行 make&./linux_logo

#冲刺创作新星# #跟着小白一起学鸿蒙# [四]移植一个开源库-开源基础软件社区

3、移植到鸿蒙系统下进行编译运行

移植到鸿蒙需要在三方库里增加文件夹和gn文件。OpenHarmony里三方库的位置在[代码目录]/third_party位置。

我们可以在三方库里创建文件夹:linuxlogo,然后在linuxlogo里创建BUILD.gn文件。接下来我们需要拷贝第三方linuxlog文件到此文件夹内。然后我们需要阅读三方库的Makefile文件。以下是基本的makefile的规则:

makefile的规则

target... : prerequisites ...command... -----------------------------------------------------------------

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命令做什么(通常是如何编译和链接程序)。

路径: /../Makefile-include Makefile.defaultPROGNAME = linux_logo#ifeq ($(OS),IRIX64) # LDFLAGS += -lintl#endififeq ($(OS),FreeBSD)LDFLAGS += -lintlendif## Installation location#INSTALL_BINPATH = $(DESTDIR)$(PREFIX)/binINSTALL_MANPATH = $(DESTDIR)$(PREFIX)/share/manINSTALL_DOCPATH = $(DESTDIR)$(PREFIX)/share/doc## Libsysinfo location#LIBSYSINFO_INCLUDE = -I$(LIBSYSINFO)LIBSYSINFO_LIBRARY = -L$(LIBSYSINFO)ifneq ($(XGETTEXT),)TRANSLATIONS = translationsendifall:Makefile.default parse_logos linux_logo $(TRANSLATIONS)Makefile.default:ifneq($(CONFIGURE_RAN),1)$(error Please run configure first)endiftranslations:cd po && $(MAKE)logos-all:logo_configfind ./logos -type f -a ! -name banner.logo -a ! -name classic.logo | sort >> logo_config$(MAKE) alllogo_config:echo "./logos/banner.logo" > logo_configecho "./logos/classic.logo" >> logo_configclean:Makefile.defaultrm -f *.orm -f linux_logo linux_logo-dyn parse_logos load_logos.hrm -f *~cd $(LIBSYSINFO) && $(MAKE) cleancd po && $(MAKE) cleandistclean: cleancd $(LIBSYSINFO) && $(MAKE) distcleanrm -f Makefile.default logo_config# rm -f po/linux_logo.pot#此处即为我们最终生成的linux_logo二进制文件,他依赖linux_logo.o,load_logo.o两个中间文件和libsysinfo.a这个库linux_logo: linux_logo.o load_logo.o ./$(LIBSYSINFO)/libsysinfo.a$(CROSS)$(CC) $(LDFLAGS) -o linux_logo linux_logo.o load_logo.o $(LIBSYSINFO_LIBRARY) ./$(LIBSYSINFO)/libsysinfo.a linux_logo_shared:linux_logo.o load_logo.o ./$(LIBSYSINFO)/libsysinfo.a$(CROSS)$(CC) $(CFLAGS) -o linux_logo-dyn linux_logo.o load_logo.o $(LIBSYSINFO_LIBRARY) -lsysinfo#此处为libsysinfo.a库的编译脚本,他会进入$(LIBSYSINFO)目录再执行make命令./$(LIBSYSINFO)/libsysinfo.a:cd $(LIBSYSINFO) && $(MAKE)parse_logos:parse_logos.o load_logo_native.o$(CC) $(LDFLAGS) -o parse_logos parse_logos.o load_logo_native.oparse_logos.o:parse_logos.c logo_config$(CC) $(CFLAGS) $(LIBSYSINFO_INCLUDE) -c parse_logos.cload_logos.h: logo_config parse_logos./parse_logosload_logo.o:load_logo.c$(CROSS)$(CC) $(CFLAGS) $(LIBSYSINFO_INCLUDE) -c load_logo.cload_logo_native.o: load_logo.c$(CC) $(CFLAGS) $(LIBSYSINFO_INCLUDE) -o load_logo_native.o -c load_logo.c#此处即为我们最终生成的linux_logo文件的main函数linux_logo.o: linux_logo.c defaults.h load_logos.h@echo Compiling for $(OS)@echo Edit defaults.h to change Default Values$(CROSS)$(CC) $(CFLAGS) $(LIBSYSINFO_INCLUDE) \-DLOCALE_DIR=\"$(PREFIX)/share/locale\" -DUSE_I18N=$(USE_I18N) \-c linux_logo.cinstall:linux_logo$(INSTALL) -c -m755 $(PROGNAME) -D $(INSTALL_BINPATH)/$(PROGNAME)$(INSTALL) -c -D -m644 $(PROGNAME).1.gz $(INSTALL_MANPATH)/man1/$(PROGNAME).1.gzcd po && $(MAKE) installinstall-doc:$(INSTALL) -c -d -m 755 $(INSTALL_DOCPATH)/$(PROGNAME)$(INSTALL) -c -p -m 644 *[A-Z] $(INSTALL_DOCPATH)/$(PROGNAME)# The old way of installinginstall-by-copying:cp linux_logo $(PREFIX)/bin

进而查看libsysinfo.a静态库下的makefile。

路径:/../libsysinfo-0.3.0/Makefileinclude Makefile.defaultall: libsysinfo.aclean:rm -f *.o *~rm -f libsysinfo.a libsysinfo.so config.hcd AIX && $(MAKE) cleancd Linux && $(MAKE) cleancd FreeBSD && $(MAKE) cleancd Irix && $(MAKE) cleancd SunOS && $(MAKE) cleancd w32 && $(MAKE) cleancd all && $(MAKE) cleandistclean: cleanrm -f Makefile.defaultinstall: #选择一种系统类型,本文选用的是armlibsysinfo.a: Linux/cpuinfo_alpha.c \ Linux/cpuinfo_ia64.c \Linux/cpuinfo_ppc.c \Linux/cpuinfo_vax.c \Linux/cpuinfo_arm.c \Linux/cpuinfo_m68k.c \Linux/cpuinfo_s390.c \Linux/cpuinfo_avr32.c \Linux/cpuinfo_mips.c \Linux/cpuinfo_sh3.c \Linux/cpuinfo_x86.c \Linux/cpuinfo_cris.c \Linux/cpuinfo_parisc.c \Linux/cpuinfo_sparc.c \Linux/sysinfo_linux.c#进入all目录进行编译cd all && $(MAKE)#进入$(OS)目录进行编译cd $(OS) && $(MAKE)$(CROSS)$(AR) crus libsysinfo.a ./$(OS)/*.o ./all/*.o#此处为libsysinfo.a库的链接命令,此处也依赖了$(OS)和all文件夹里的内容shared: libsysinfo.ald -shared -o libsysinfo.so ./$(OS)/*.o ./all/*.o

查看all文件下的makefile。

路径: /../libsysinfo-0.3.0/all/Makefileinclude ../Makefile.defaultall:bogomips.o fix_mhz.o parsing.o string_truncate.o sysinfo_common.o uname.obogomips.o: bogomips.c$(CROSS)$(CC) $(CFLAGS) $(LIBSYSINFO_INCLUDE) -c bogomips.cfix_mhz.o:fix_mhz.c$(CROSS)$(CC) $(CFLAGS) $(LIBSYSINFO_INCLUDE) -c fix_mhz.cparsing.o:parsing.c$(CROSS)$(CC) $(CFLAGS) $(LIBSYSINFO_INCLUDE) -c parsing.csysinfo_common.o: sysinfo_common.c$(CROSS)$(CC) $(CFLAGS) $(LIBSYSINFO_INCLUDE) -c sysinfo_common.cstring_truncate.o:string_truncate.c$(CROSS)$(CC) $(CFLAGS) $(LIBSYSINFO_INCLUDE) -c string_truncate.cuname.o:uname.c$(CROSS)$(CC) $(CFLAGS) $(LIBSYSINFO_INCLUDE) -c uname.cclean:rm -f *.orm -f *~

4、编译开源库

在BUILD.gn文件里增加以下内容。可以参考third-party/libuv/BUILD.gn里的内容。

ohos_executable("linuxlogo"){include_dirs=["linux_logo-master","linux_logo-master/libsysinfo-0.3.0","linux_logo-master/libsysinfo-0.3.0/include",]sources=["linux_logo-master/linux_logo.c","linux_logo-master/load_logo.c","linux_logo-master/libsysinfo-0.3.0/Linux/cpuinfo_arm.c","linux_logo-master/libsysinfo-0.3.0/all/bogomips.c","linux_logo-master/libsysinfo-0.3.0/all/fix_mhz.c","linux_logo-master/libsysinfo-0.3.0/all/parsing.c","linux_logo-master/libsysinfo-0.3.0/all/string_truncate.c","linux_logo-master/libsysinfo-0.3.0/all/sysinfo_common.c","linux_logo-master/libsysinfo-0.3.0/all/uname.c","linux_logo-master/libsysinfo-0.3.0/Linux/sysinfo_linux.c",]}

完成后,这个开源库还需要有一个入口进行加载,在此文章中我们仍然选取graphic的BULID.gn进行依赖添加。

路径:test/xts/acts/grahpic/BUILD.gnimport("//build/ohos_var.gni")group("graphic") {testonly = trueif (is_standard_system) {deps = ["webGL:webGL_hap_test","windowstandard:window_hap_test",//增加下面这行引入依赖"//third_party/libuv:linuxlogo",]} else {deps = ["appaccount:appaccount_hap","osaccount:osaccount_hap",]}}

同**《#跟着小白一起学鸿蒙# [二]编写一个Hello World文件》** 一样。

在源码根目录下执行。

./build.sh --product-name rk3568 --gn-args build_xts=true --build-target "acts" --gn-args is_standard_system=true

5、执行开源库

编译完成后生成的第三方库验证程序linuxlogo使用流程。

库文件会输出linuxlogo,路径为:out/rk3568/common/common。

hrt@ubuntu:~/oh31/out/rk3568/common/common$ lsglctslibdeqp_ohos_platform.z.solibhmicui18n.z.solibphonenumber_standard.z.solibrosen_context.z.solibclibgif.z.solibhmicuuc.z.so linuxlogolibprotobuf_standard.z.so libsqlite.z.so

1. 拷贝linuxlogo到板子上hdc_std.exe file send linuxlogo /data/local/tmp//2. 登录板子,运行linuxlogo,如果第一次需要给权限pc端:hdc_std.exe shell板子:cd /data/local/tmp板子:chmod +x runtest板子:./linuxlogo

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。

总结

本文主要介绍了在开源鸿蒙下如何移植一个开源库,手写一个BUILD.gn、编译运行。

责任编辑:jianghua 来源:51CTO开源基础软件社区 鸿蒙开源

推荐系统

  • 微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载

    微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载

    语言:中文版系统大小:5.13GB系统类型:Win11

    微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Win11 64位 Office办公版(免费)优化  1、保留 Edge浏览器。  2、隐藏“操作中心”托盘图标。  3、保留常用组件(微软商店,计算器,图片查看器等)。  5、关闭天气资讯。 

  • Win11 21H2 官方正式版下载_Win11 21H2最新系统免激活下载

    Win11 21H2 官方正式版下载_Win11 21H2最新系统免激活下载

    语言:中文版系统大小:4.75GB系统类型:Win11

    Ghost Win11 21H2是微软在系统方面技术积累雄厚深耕多年,Ghost Win11 21H2系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Ghost Win11 21H2是微软最新发布的KB5019961补丁升级而来的最新版的21H2系统,以Windows 11 21H2 22000 1219 专业版为基础进行优化,保持原汁原味,系统流畅稳定,保留常用组件

  • windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载

    windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载

    语言:中文版系统大小:5.31GB系统类型:Win11

    windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载,微软win11发布快大半年了,其中做了很多次补丁和修复一些BUG,比之前的版本有一些功能上的调整,目前已经升级到最新版本的镜像系统,并且优化了自动激活,永久使用。windows11中文版镜像国内镜像下载地址微软windows11正式版镜像 介绍:1、对函数算法进行了一定程度的简化和优化

  • 微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载

    微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载

    语言:中文版系统大小:5.31GB系统类型:Win11

    微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载,微软2022年正式推出了win11系统,很多人迫不及待的要体验,本站提供了最新版的微软Windows11正式版系统下载,微软windows11正式版镜像 是一款功能超级强大的装机系统,是微软方面全新推出的装机系统,这款系统可以通过pe直接的完成安装,对此系统感兴趣,想要使用的用户们就快来下载

  • 微软windows11系统下载 微软原版 Ghost win11 X64 正式版ISO镜像文件

    微软windows11系统下载 微软原版 Ghost win11 X64 正式版ISO镜像文件

    语言:中文版系统大小:0MB系统类型:Win11

    微软Ghost win11 正式版镜像文件是一款由微软方面推出的优秀全新装机系统,这款系统的新功能非常多,用户们能够在这里体验到最富有人性化的设计等,且全新的柔软界面,看起来非常的舒服~微软Ghost win11 正式版镜像文件介绍:1、与各种硬件设备兼容。 更好地完成用户安装并有效地使用。2、稳定使用蓝屏,系统不再兼容,更能享受无缝的系统服务。3、为

  • 雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载

    雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载

    语言:中文版系统大小:4.75GB系统类型:

    雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载在系统方面技术积累雄厚深耕多年,打造了国内重装系统行业的雨林木风品牌,其系统口碑得到许多人认可,积累了广大的用户群体,雨林木风是一款稳定流畅的系统,一直以来都以用户为中心,是由雨林木风团队推出的Windows11国内镜像版,基于国内用户的习惯,做了系统性能的优化,采用了新的系统

  • 雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO

    雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO

    语言:中文版系统大小:5.91GB系统类型:Win7

    雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO在系统方面技术积累雄厚深耕多年,加固了系统安全策略,雨林木风win7旗舰版系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。win7 32位旗舰装机版 v2019 05能够帮助用户们进行系统的一键安装、快速装机等,系统中的内容全面,能够为广大用户

  • 番茄花园Ghost Win7 x64 SP1稳定装机版2022年7月(64位) 高速下载

    番茄花园Ghost Win7 x64 SP1稳定装机版2022年7月(64位) 高速下载

    语言:中文版系统大小:3.91GB系统类型:Win7

    欢迎使用 番茄花园 Ghost Win7 x64 SP1 2022.07 极速装机版 专业装机版具有更安全、更稳定、更人性化等特点。集成最常用的装机软件,集成最全面的硬件驱动,精心挑选的系统维护工具,加上独有人性化的设计。是电脑城、个人、公司快速装机之首选!拥有此系统