1 概述
1.1“中间件”概念
中间件软件是一种计算机软件,为应用软件提供操作系统所不能提供的服务。
中间件处于操作系统软件与用户的应用软件的中间层,为上层的应用软件提供运行与开发的环境并帮助用户开发和集成应用软件,下层要兼容操作系统接口。它不仅要实现互连,还要实现应用之间的互操作,网络通信功能是其特点之一,因此在移植中间件过程中会牵涉到很多网络方面的知识。
不同平台设备为了实现通信互联,并且达到统一标准的效果,就需要同样的中间件适配不同的操作系统。
图 1-1 中间件进行信息传递
执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或 OS 环境,提高并行处理能力,提高安全性。
1.2 中间件依赖关系
中间件也有很多不同的分类,比如终端仿真中间件、数据访问中间件、远程过程调用中间件、消息中间件、交易中间件、对象中间件等,其之间存在相互依赖的关系。
2 技术实现2.1 移植前评估工作
一个第三方中间件可能需要其余中间件的支持,这就要求在移植前准确评估所有依赖的中间件,从而确定工作量。
中间件移植前期评估流程如图 2-1所示。
图2-1 中间件评估流程
2.2移植过程总结
Linux环境下中间件配置、编译、安装流程:
1.一般我们移植的第三方中间件都是使用autoconf来配置,autoconf 是用来生成自动配置软件源代码脚本(configure)的工具,configure脚本能独立于autoconf运行,且在运行的过程中,不需要用户的干预,Linux环境下中间件配置过程如图 2-2所示。
图2-2 Linux环境中间件配置过程
2.来生成一个config.h文件、Makefile文件和其余文件,其中./configure需要的参数一般需要用--host=arm-linux来指定交叉编译换将(需要先安装一个arm-linux-gcc编译器),--prefix=/xxx来指定安装目录。config.h文件和Makefile文件作用如图 2-3所示。
图2-3 config.h文件和Makefile文件
3.执行make指令,这个过程主要是为了等它编译完成后,可以通过find -name *.o命令看它都编译了哪些源文件,当然我们也可以通过看编译输出的log信息,看它链接时都链接了哪些.o目标文件。如图 2-4所示,以SOEM源码移植过程为例,通过find-name *.o命令查看编译了哪些源文件。
图2-4 SOME源码make之后执行“find –name *.o”命令
也可通过此方式来确定Linux环境下中间件编译了哪些源文件。确定了需要编译哪些源文件之后,我们就可以把中间件源码导入到SylixOS工程。
建立 SylixOS动态库工程,导入源文件、头文件,配置Makefile,修改编译错误:
1.开发套件包含RealEvo-IDE集成开发换件,在该IDE下可建立动态库工程(SylixOSShared Lib),以“lib”加上“中间件名称”命名比较合适(如“libexample”)在工程根目录下放入第三方中间件(去掉版本号)。
2.修改libexample.mk(这是SylixOS工程下的Makefile),把它的源文件列表,头文件搜索路径,需要定义的符号,依赖程序清单21展示了SylixOS工程的Makefile格式。
程序清单2-1 SylixOS工程的Makefile介绍
#********************************************************************************************************* # Clear setting #********************************************************************************************************* include $(CLEAR_VARS_MK) #********************************************************************************************************* # Target #********************************************************************************************************* LOCAL_TARGET_NAME := libexample.so .o目标文件最终链接成的.so动态库文件 #********************************************************************************************************* # Source list #********************************************************************************************************* LOCAL_SRCS := \ 要编译的源文件,这些源文件编译成.o目标文件 SOEM/osal/linux/osal.c \ #********************************************************************************************************* # Header file search path (eg. LOCAL_INC_PATH := -I"Your hearder files search path") #********************************************************************************************************* LOCAL_INC_PATH := \ 头文件依赖的路径 -I"$(WORKSPACE_libSOEM)/SOEM\osal" \ #********************************************************************************************************* # Pre-defined macro (eg. -DYOUR_MARCO=1) #********************************************************************************************************* LOCAL_DSYMBOL := -DYOUR_MARCO = 1 预定义的宏 LOCAL_DSYMBOL += -DCONFIG #********************************************************************************************************* # Compiler flags #********************************************************************************************************* LOCAL_CFLAGS := 预设值的编译选项 LOCAL_CXXFLAGS := #********************************************************************************************************* # Depend library (eg. LOCAL_DEPEND_LIB := -la LOCAL_DEPEND_LIB_PATH := -L"Your library search path") #********************************************************************************************************* LOCAL_DEPEND_LIB := 要依赖的动态库文件 LOCAL_DEPEND_LIB_PATH := #********************************************************************************************************* # C++ config #********************************************************************************************************* LOCAL_USE_CXX := no LOCAL_USE_CXX_EXCEPT := no #********************************************************************************************************* # Code coverage config #********************************************************************************************************* LOCAL_USE_GCOV := no 代码覆盖率配置选项 #********************************************************************************************************* # User link command #********************************************************************************************************* LOCAL_PRE_LINK_CMD := LOCAL_POST_LINK_CMD := LOCAL_PRE_STRIP_CMD := LOCAL_POST_STRIP_CMD := include $(LIBRARY_MK) #********************************************************************************************************* # End #*********************************************************************************************************
3.编译可能会出现错误,错误的类型有很多,如果需要修改第三方中间件,请写一个README.SylixOS文本文件在工程的根目录,把修改的文件,修改的方法记录到该文件内。修改需要加入条件编译预处理的相关内容,格式如下。
#ifdef SylixOS
修改的内容
#endif
4.移植中间件的主要工作量体现在编译错误修改的过程,有些符号、函数定义或命名方式不同,要修改其适配SylixOS,有些依赖的库文件SylixOS没有或者只有类似的,我们要根据正确的语义,适当修改中间源程序或者裁剪源程序(功能缺失不严重的情况下)。中间件有很多和网络通信相关的文件(有部分工作量要移植SylixOS暂时不支持的网络相关协议。
5.当移植成功时,应该考虑将第三方中间件的测试用例、example也编译,测试用例一般用unit-test,example一般用application目标,RealEvo-IDE允许多目标的新建。最后输出应用技术笔记,记录移植过程中注意事项以及描述相关测试用例的使用方法。
3 移植案例libpcap
libdb
libnopoll
详细移植过程文档待补充(该文档移植方法和经验后续还会逐步总结完善)。
4 参考资料《SylixOS应用开发手册》
第21章 标准第三方软件介绍
第22章 平台迁移
《Linux下使用automake、autoconf生成configure文件》
参考博客地址:http://www.cnblogs.com/bugutian/p/5560548.html