SylixOS 应用移植指导——以Redis5.0.3为例(二)

tc666
tc666
tc666
8
文章
1
评论
2021年6月30日18:11:43 评论 986

前期准备:

首先需要有一台Linux作为参考,SylixOS工程最终的表现形式与Linux越接近,说明移植的效果越好。

其次需要找到需要移植的应用源码,搞清它库之间的依赖关系,并确保其所有的依赖库(SylixOS下的动态库,或源码)可以获得。举个例子,我需要移植A工程,其依赖libB.so,是A工程内自带并编译的,依赖zlib,依赖libssl。由于libB.so是工程自带并有源码编译的,不需要关心,libssl是SylixOS base工程内自带的,不需要关心,只需要链接,而zlib是没有的,这时候就需要先自行下载zlib源码并编译。

像zlib、libxml2、libjson这类的库,自身无依赖,只作为其他工程依赖的库,移植都比较简单,大部分是编译过就能用的。

然后需要有SylixOS的验证环境,这里推荐使用真机,如果没有就用IDE自带的模拟器验证吧。

 

一、Linux下编译

移植不是乱移,不是把所有.c编译一下就可以的。首先我们需要在Linux下确定需要编译的.c文件。

获得工程源码,并解压:

SylixOS 应用移植指导——以Redis5.0.3为例(二)

进入Linux工程目录,Linux下的工程一般是三步走,即./configure、make、make install :

进目录一看,没有configure,那就看一下Makefile,发现实际调用的是src目录下的Makefile:

SylixOS 应用移植指导——以Redis5.0.3为例(二)

那就敲个make看看,发现有报错提示:

SylixOS 应用移植指导——以Redis5.0.3为例(二)

这里是因为Redis可以依赖jemalloc,而我的环境下没有jemalloc,刚好SylixOS也不支持jemalloc,百度可知 make MALLOC=libc 可以使用普通的malloc。

敲make MALLOC=libc,发现编译的时候只提示编出哪些.o,而没有完整的编译过程,这点不好,不利于我们移植,通过V=1参数让gcc打印完整过程:

SylixOS 应用移植指导——以Redis5.0.3为例(二)

SylixOS 应用移植指导——以Redis5.0.3为例(二)

等待编译中。。。

发现链接的时候报了错,是没有liblua.a,且这个库应当在deps目录下。进入deps目录,发现有一些redis的依赖库,分别是lua、hiredis、jemalloc和linenoise。lua和linenoise是必要的,hiredis是redis client的依赖库,jemalloc不是必要的。那就先编译依赖库:

SylixOS 应用移植指导——以Redis5.0.3为例(二)

再切回上一级目录继续编译redis,发现已经可以编完:

SylixOS 应用移植指导——以Redis5.0.3为例(二)

那就make install一下,看看究竟编了哪些ELF,如果不喜欢install到/usr/bin之类的目录下,可以自行指定PREFIX:

SylixOS 应用移植指导——以Redis5.0.3为例(二)

看一下build目录,编出了redis-server、redis-client以及其他附带的ELF:

SylixOS 应用移植指导——以Redis5.0.3为例(二)

这时候我们明确这次移植的流程:

首先需要编译linenoise、liblua.a、libhiredis.so。再依赖其编译出redis-server、redis-client等其他工具。并且,我们有了所有工程的编译流程,可以获得以下信息:需要编译的.c文件名、编译的参数、链接参数、库依赖关系等。这为我们的移植铺平了道路。什么?你说不知道liblua要编哪些文件?make distclean一下,再到deps目录下make lua去。

把所有的编译流程贴到notepad,准备开始下一步的移植。

tc666
  • 本文由 发表于 2021年6月30日18:11:43
  • 转载请务必保留本文链接:http://www.databusworld.cn/10334.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: