李武松 钟立俊 段国栋
(西南电子设备研究所,四川成都 610036)
近年来,自主可控需求增强,软件应用国产化移植变得非常重要,然而不同平台有不同的系统特性,Win32 应用软件移植到国产化平台上,缺少较好的“脚手架”移植辅助工具[1]。本文以非嵌入式平台银河麒麟和嵌入式平台DeltaOS 为例,研究Win32平台基于Visual Studio 2010(以下简称“VS2010”)开发的C/C++程序国产化移植过程中“脚手架”的构建方法,并结合实践对比分析,提出“脚手架”的构建有助于大大提升国产化移植效率。
银河麒麟(Kylin)是由国防科技大学研制的一套具有中国自主知识产权的开源服务器操作系统,已广泛应用于军工、政府、金融等众多领域[2]。像其它Linux 操作系统移植一样,软件开发编译需要编写makefile,这对已经习惯于Win32 操作系统可视化编程开发者而言,刚开始会非常不适应,更何况各种各样的配置。因此如果有一种方式能让makefile 生成变得模板化、自动化,能够解决首次接触后台国产化移植“晕头转向”的现实问题,将大大提高非嵌入式操作系统银河麒麟的移植效率。
银河麒麟兼容Linux,故编译器采用gcc、g++,我们对银河麒麟移植过程中编写的makefile 文件内容进行分析,对比发现不同项目工程makefile 的区别主要有三点[3]:
3.1.1 目标文件不同
在Win32 中一个C/C++实现文件(即.cpp 文件)编译后会生成一个目标文件(即.obj 文件),同样在银河麒麟上,一个.cpp 文件编译后对应生成一个.o 文件,在makefile 中针对每一个.cpp文件都需要进行显性化的配置。
3.1.2 包含依赖不同
不同的项目包含不同路径下的头文件,包含目录存在不同,同时不同的项目依赖不同路径下的不同库文件,依赖库目录和依赖库不同。具体体现到makefile 中,包含目录(-I)、依赖库目录(-L)、依赖库(-l)的参数配置不同。
3.1.3 程序类型不同
项目生成不同类型的程序对应的链接参数是不同的,生成可执行程序没有“-shared”参数,而生成动态库或者静态库需要添加“-shared”参数,生成动态库则还需要添加“-Wl”和“-rpath”参数。
经过对银河麒麟移植makefile 分析,提取出共性内容作为模板,通过程序代码自动生成共性内容,针对不同项目的差异点,以可视化人机交互的方式进行配置,差异化生成个性部分,从而确保能生成完整内容,MakefileTool 工具左侧为配置区,针对上述目标文件不同、包含依赖不同、程序类型不同情况,以人机交互的方式进行配置,右侧为预览生成区,预览或者编辑生成的makefile 内容。
使用MakefileTool 工具移植程序包括以下步骤:
3.3.1 启动MakefileTool 工具,下拉框选择程序类型,文件浏览设置项目路径,程序将自动读取并列出对应路径下所有.cpp文件。
3.3.2 在其他项中依次设置包含目录、依赖库目录和依赖库。
3.3.3 点击生成按钮,右侧查看makefile 内容预览,点击保存按钮,在项目工程目录下自动生成makefile 文件,上传代码和makefile 文件到银河麒麟。
3.3.4 通过命令“cd”到项目工程所到目录,执行命令“make-f makefile_yhql debug”即可开启移植编译。
按照上述步骤,我们在银河麒麟4.0.2 上分别对SFApplication(可执行程序)、RedisClientUnix(静态库)、KDClass(动态库)项目工程进行了移植,生成makefile,分别按第7 步执行,完成编译后,移植生成在银河麒麟上能运行的态势服务程序,并测试运行成功。
可以看出,使用银河麒麟MakefileTool 工具,在可视化交互下能快速自动生成makefile,以实测三个项目工程为例,手动配置形成makefile 至少需要15 分钟以上,而使用该工具最多5 分钟即可完成配置,生成的makefile 不易出错,且经过实测能够在银河麒麟上顺利进行编译移植。
DeltaOS 是目前中国依靠自己的技术和力量自主开发的最成熟的全中文嵌入式实时操作系统[4]。DeltaOS 软件开发在交叉编译时可依托官方提供的集成开发环境LambdaTOOL[5],然而从Win32 平台基于VS2010 开发的Qt 项目移植到DeltaOS 时,要从零开始构建项目解决方案,新建项目、配置属性,特别费时费力。因此如果有一种方式能让项目的构建变得更加自动化、智能化,能够解决“巧妇难为无米之炊”的现实问题,将有助于提高嵌入式操作系统DeltaOS 的移植效率。
QtCreator 是Qt 被Nokia 收购后推出的一款新的轻量级集成开发环境(IDE),包括项目生成向导、C++代码编辑器、浏览文件、GDB 调试前端、qmake 构建工具等[6]。作为一款轻量级的IDE,能与Visual Studio 项目工程文件实现无缝转换,同时满足Qt 跨平台开发需求[7]。可以将要移植Visual Studio 项目一键转换成QtCreator 能读取的项目;进一步,结合跨平台开发需求,直接编译出在DeltaOS 上能运行的程序文件,这样就可省去配置环节,直接完成移植编译,问题就聚焦到如何在QtCreator 上构建出DeltaOS 的编译环境。
利用QtCreator3.5.0 的构建和运行环境可配置功能,构建DeltaOS 6 的编译环境,步骤如下:
5.2.1 设定DeltaOS 下Qt 定制版本存于目录“D:qt-4.8.3-dao”,DeltaOS 系统文件存于目录“D:qt-deltaos”,安装QtCreator工具,并添加环境变量。
5.2.2 启动QtCreator,依次点击【工具】-【选项】,弹出的页面,点击【构建和运行】。
5.2.3 点击【编译器】Tab 页,添加一个Custom 编译器,命名为“DAO”,Compiler path 设置为“D:qt -deltaos...x86 -win32inc++pentium.exe”,Make path 设置为“D:qt-deltaos...make.exe”,ABI 选择“x86 -vxworks -vxworks -elf -32bit”,Qt mkspecs 设置为“qws/vxworks-pentium4rtp-g++”。
5.2.4 点击【Qt Versions】Tab 页,添加一个Qt Versions 为“D:qt-4.8.3-daoinqmake.exe”。
5.2.5 点击【构建套件(Kit)】,添加一个构建套件命名为“DAO”,编译器选择之前设置好的“DAO”,Qt 版本选择之前添加的“Qt 4.8.3 (qt-4.8.3-dao)”。
5.2.6 上述设置好后,就可以新建或打开PRO 项目工程,选择DAO 的构建套件,编译生成DeltaOS 上运行的移植程序。
利用DeltaOS“脚手架”QtCreator(DAO 构建套件)上进行程序移植主要包括以下三个步骤。
5.3.1 在Win32 上利用VS2010 打开项目解决方案,右键选择要移植的项目,点击【create basic .pro File】,生成pri 资源描述文件和pro 项目工程文件。
5.3.2 在Win32 上用QtCreator 打开上述转换的pro 项目工程文件,设置项目构建套件为“DAO”,右键选中项目,点击【构建】,在【编译输出】窗口中查看编译结果。
5.3.3 编译完成后,将程序拷贝到DeltaOS 操作系统目标机上测试运行。
按照上述步骤,我们对“QFreqAssAnlyseUI”工程进行了移植,第一步利用VS2010 转换生成pri、pro 文件;第二步,用QtCreator 打开pro 文件,通过构建工程开始移植编译;第三步,完成移植编译,生成“libQFreqAssAnlyseUI.so”移植库,拷贝到DeltaOS 操作系统目标机上测试调用运行成功。
可以看出,使用DeltaOS“脚手架”QtCreator 工具,能一键自动将VS 工程转换为Pro 工程,并基于成熟现有IDE 可视化完成编译,以实测一个项目工程为例,手动配置形成工程文件至少需要5 分钟以上,而使用该工具最多1 分钟即可自动完成,生成的Pro 工程文件属性齐全,且经过实测完成编译后能够在DeltaOS 上顺利运行。
综上,我们从移植的痛难点分析入手,在“脚手架”的构建和项目实测方面分别介绍了在银河麒麟和DeltaOS 操作系统上的国产化移植“脚手架”应用情况。以实际移植经验剖析了银河麒麟makefile 配置复杂繁琐和DeltaOS 上项目构建费时费力的现状问题,提出了通过现有技术利用的方式构建银河麒麟和DeltaOS 的移植“脚手架”的构建方法,移植“脚手架”工具((MakefileTool 和QtCreator)在实际项目中得到了充分可行验证,构建方法简单、便捷,有助于大大提升国产化移植效率,值得推广和使用。