VAPS XT入门系列22:VAPS XT大工程集成开发与编译

系列索引:VAPS XT4.2.1入门系列索引

方案

如果一个VAPS XT工程太大,单个工程超过2GB。那么在性能较弱的PC上开发、编译、运行都会出现问题(升级是不可能升级的,这辈子都不可能升级的)。

根据开发的各个阶段,VAPS XT的开发商提供了两种不同的方案,VAPS XT用户某研究所提供了第三种方案。

方法

方案一:集成编译

也就是本文涉及的方案,本文的方案描述基于Presagis方案修改。

  • 以根工程和子工程的方式设计VAPS XT程序
  • 根工程负责窗口管理、子工程负责窗口
  • 分别进行设计、生成代码、编译
  • 将子工程的*.obj替换掉根工程的同名文件
  • 编译根工程、生成程序

方案二:VxWorks多分区方案

将程序部署在Vxworks平台上,不同的窗口部署在不同的分区。此方案的具体细节我还有见到,也没有测试过,不做过多评价。

方案三:窗口管理器

此方案由某研究所提供,经过我方项目负责人评估后暂时没有接。

将各个窗口编译为可执行程序,然后在Linux操作系统(为什么是Linux操作系统上呢?因为要部署在国产平台,那帮奸商最喜欢搞Linux换皮)上开发一个基于X11/Wayland的窗口管理器。

这样每个程序都很小,想用哪个用哪个。

具体见XWayland开发入门系列索引

此方案目前属于前期探索。

说明

测试环境:Windows10 + VAPS XT4.1 + Visual Studio 2010 Express

集成编译

此引导的目的是演示如何高效创建和分割大VAPS XT工程。此方法可以让大团队的工程易于管理、集成、编译。

引导包含三个部分:

  • 设计顶层工程架构
  • 实现独立子工程
  • 集成工程和编译

介绍

以下是工程拆分为子工程和集成的完整流程:

  • 将程序拆分为不同的页面或者部分(这样不同团队可以处理不同页面/部分),然后:
    • 定义编译对象接口(比如在*.vcls中定义对象属性,但是保持空实现)或者,
    • 定义带i/o(data sender/receiver)接口的formats文件(允许数据再format之间传输)
  • 定义每个页面/部分的命名空间(比如使用特别前缀以避免命名冲突):
    • 新数据类型
    • 新对象(小组件)
  • 定义公共共享资源(tables,stylingRules):
    • 颜色、线型、填充模式、渐变、透明度
    • 字体表和字体
    • 图片和图片表
    • 其他项目指定的表
    • 样式规则
  • 定义每个页面/部分所使用的每个表的索引范围(比如,页面/部分1只能使用图片库的第0-9部分,页面/部分2只能使用图片表的20-29,等等)
  • 创建一个顶层根工程作为模板,包括:
    • 共享的全局资源
    • 接口使用的数据类型
    • 接口
    • 每个页面/部分对应的子工程(每个开发团队的沙箱)
    • 每个页面/部分占位的空实现
  • 将子工程(页面/部分)分配给不同的开发团队,他们必须在上面定义的基础上开发
  • 每个子工程可以包含只在此工程中使用的条目,比如数据类型,资源、特有的小组件。但是:
    • 他们必须被包含在子工程中
    • 遵守命名规则(使用特有的前缀)
    • 本地资源可以以本地表(超过分配表范围的颜色、线性、填充模式、渐变效果、透明度、字体表)的形式包含在子工程的formats中
  • 当子工程提交回根工程,集成人员必须:
    • 创建使用模板工程的页面/部分的顶层显示定义或者format
    • 验证每个子工程的名称、表索引范围没有冲突
    • 部分 工程要能无缝集成
    • 全局XML表应该以XML级别合并(如果其他团队有修改)
    • 每个页面/部分 可以被编译为自包含的库/objs(每个团队需要提交这些库/objs),非可执行文件(这样可以避免共享VAPS XT通用命名空间)
    • 生成代码(不要编译,仅生成代码)然后手动创建一个Makefile文件(这里不使用代码生成的Makefile文件,但是它将作为开始点)并将提交的库/objs添加到其中。
    • 在终端,编译最终的程序

测试时,使用最简单的方式和内容,显示一个罗盘。

compass

工程配置

创建顶级工程架构

创建新工程

new project

添加一个画面对象

new ob

设置画面对象的属性

property

当然,*.vimp保持为空。

创建一个format用于显示,当然暂时为空

format

按照要求添加一个显示定义

dd

并在其中添加一些窗口

detail

其他的不需要处理,毕竟只是简单测试。

将Settings中的CODE nGEN中,Use Generate Dependency Objs修改为Yes,Resource Generation修改为:SaveAsBinaryFile。

settings

Windows下默认使用wogl.cfg配置文件,我们将其复制一份,命名为wogl_lib.cfg。修改BUILD_TYPE=lib,用于编译*.lib而不是可执行文件。

将此模板分发给各个开发人员用于后续开发。

子工程开发

获取到模板工程后,就可以进行子工程开发了。

ob

右键Cformat,生成代码。

code

打开代码文件夹中的*.mak文件,删除字段中已经在顶级工程中存在了的内容。

选择wogl_lib.cgf配置,然后点击Build Only

build only

编译生成*.lib文件

lib

工程集成

一旦所有团队完成设计,集成者可以把子工程集成到顶级工程模板中。有两种方法

1、将子工程集成到大工程中
2、编译每个子工程的lib文件,然后用修改后的Makefile编译大工程

此处使用第2中方法。

你需要一个顶级工程和子工程。

1、生成TopLevelDisplay的代码

2、将子工程的*.lib复制过来。

3、合并TopLevelDisplay和子工程的Format代码中的*_init.cpp的头文件,make文件

files

至于怎么操作

得加钱

4、执行顶级工程的Build Only

效果为:

result

在顶级工程中GO是没有内容的,只有*.lib中有,那么可以确定是集成编译操作。

注意

  • 如果使用的是已有的界面,注意尺寸数值要统一
  • 此方案调用的是Format