本文章致力于指导有一定SylixOS开发基础的用户进行中大型应用软件移植。
没有SylixOS应用开发基础的建议先参考IDE自带的《RealEvo-IDE使用手册.pdf》,了解SylixOS IDE下的不同的工程类型,尝试过APP与动态库编译后再读本文,会更容易上手。
推荐书籍:《程序员的自我修养--链接、装载和库》
总述:
SylixOS应用移植遵循的四步原则是:搬 改 测 查。
1. 搬:
既然是移植,首先我们要确定移植的目的。本文以Redis5.0.3为例,源码来自Redis官网,源码编译环境为Ubuntu20.0,移植目标环境是SylixOS X86平台,版本是2.0.1。移植的目标是将Redis-Server、Redis-Client运行在SylixOS环境下,编译出的其他文件,可移植的就一起加入工程。
移植不是盲目的,像Redis这样的,对第三方库依赖非常少的,可行性较高。如果是Linux下依赖Linux比较核心机制的库就很难移植,比如一些依赖X11的中间件。而那些根本不开源只提供Linux下动态库的就更不用说了。
言归正传,何谓搬,搬就是希望将Linux下的整个工程源码、编译流程、生成的文件,分毫不动的在SylixOS下实现一遍。这当然是移植的最好结果,然而事实是SylixOS并不是Linux,或多或少都存在差异性,差异体现在API实现的数量、进程创建的机制、系统参数的配置等各方面。
所以,原则上应用移植需要照搬Linux工程源码,并参考Linux编译流程,搭建基于SylixOS IDE的应用工程。
2. 改:
然而照搬的工程编译一般没法一次通过,甚至编译通过后,运行时会提示“can not find symbol xxx“ 的提示,这是因为SylixOS是交叉编译的,编译器并不清楚实际运行的环境中是否存在某个符号(符号可以理解为函数、变量),只会有告警(有声明不会告警),而无法判断你的应用是否正确的实现了所有需要的符号。
所以在工程编译阶段,由于操作系统的不同,需要我们修改工程源码。大部分情况下是注释掉不支持的接口,移植性较好的工程一般有config.h供用户注释相关宏定义,以做到工程裁剪或替换功能。小部分情况需要我们自行修改相关实现,以适用于SylixOS的运行环境。
当工程修改到:编译不会报错,编译完成的可执行文件(ELF)可以上传到SylixOS运行环境下,运行不会提示找不到符号表了。别太早高兴,这只说明,移植的第一步终于完成了。
3. 测
既然都可以运行了,那就开测吧。一般来说,Linux的工程源码内都会配有test目录,或其他测试脚本。测的目的就是通过这些测试用例。
当然,初步移植的应用大概率是 ./xxx 运行的时候,应用直接跑飞,系统报个栈回溯。无论是应用直接跑飞、测试用例跑飞、还是测试用例表现结果与预想不一致,这都说明我们的移植还存在问题,需要开始 查。
4. 查
问题排查,移植中最头疼的一部,由于问题五花八门都有可能,在后续的移植指导中会带着提到。
当然,大概率问题是出在第二步 改 那里,可以重点关注一下自己改的是否存在问题。
测和查是循环的过程,当排完所有问题,所有测试用例通过之后,可以说自己的应用移植已经完成大部分了。那还有什么问题呢?那就涉及到更高级的一些玩法,比如跨平台配置,工程的美观性配置等等。
2021年6月30日 17:29 1F
赵哥牛逼
2021年9月8日 23:17 2F
继续围观
2021年12月30日 09:55 3F
太强了