问题描述
在使用 awtk 开发嵌入式 gui 项目时,一般会先创建一个 PC 端工程来设计 UI。设计好的 UI 程序发给客户演示时,在客户的电脑上执行 demo 程序可能会产生异常。
这种异常产生的原因可以分为两大类:
- UI 程序中的潜在问题
- 用户系统的问题
具体的描述见下文。
UI 程序中潜在的问题
1.资源文件从文件系统加载
当编译脚本中设定从文件系统中加载资源时,编译好的程序能够在开发环境中正常执行,可一旦将程序放到其它的非法路径中,程序便执行异常,这就表明资源文件未编译到程序中,需要检查编译脚本,添加、修改必要的宏。
2.代码中未包含头文件就调用函数
c 语言中的函数调用需要遵循先声明后使用的规则。声明告诉编译器函数的返回值类型、不同的参数类型,这样编译器就能在编译过程中检查函数调用的参数传递与返回值的使用是否正确。
例如在 windows 中使用 VS 编译器编译 c 程序时,Warning C4047 这种警告就是由于没有包含头文件就调用函数而产生的。
对于这种问题,编译器不会报错,它会假定函数的参数与返回值的类型均为 int 型。这样,当程序在不同位数的系统中运行时,可能会产生问题。
一个具体的例子
假设项目中有如下函数:
int read_buffer(char* buffer, size_t size, int flags);
函数调用语句如下:
read_buffer(buffer, size, 0);
如果在上述函数调用语句之前找不到 read_buffer 函数的原型,编译器会假定 read_buffer 的参数类型为 int 型,这样当你在 32-bit 系统中编译程序,指针大小一般与 int 型相同,程序能够正常运行。当你尝试在 64-bit 系统中运行程序时,int 一般是 32-bit,指针一般是 64-bit,这里会产生指针截断,当截断了实际的地址时就会产生异常。
因此,为了保证 demo 能在不同的平台上运行,编译时的这种警告务必消除。
3.不同级别变量类型的强转
在 c 语言中常常会将一种变量类型强转为另一种类型。在强转的过程中也可能会产生上面描述的问题。因此,这种警告也必须消除。
4.nanovg 后端使用 opengl 造成的兼容性问题
awtk 中使用的 nanovg 后端能够根据不同的平台进行调整。这里需要注意的是当你使用 opengl 作为 nanovg 后端实现时,由于 opengl 的兼容性不好,在一些系统中可能会产生问题。这里建议配置 nanovg 后端为 agge,使用 agge 时能避免一些兼容性问题。
用户系统中的问题
用户系统中的问题主要有两方面:
- 不同总线位数系统的问题
- 缺少 vs 运行时库
在不同位数系统中运行程序的问题比较常见,这里就不赘述了。
缺少 vs 运行时库的问题可以通过安装运行时库解决。
界面显示残缺
这个一般是 dpi 设置过高的问题,通过适当调低 dpi 就能够解决问题。
关闭调试信息
演示 demo 中一般不需要输出调试信息,用户只需要在编译参数设定时指定 NDEBGU 即可。