symbian c++ 移植为 qt (2)

罗业
2023-12-01

    该篇讲一些移植项目进展中出现的问题:

 

    1:我们移植出最初版本之后,别组同事拿去参考,于是他们也搭建了环境,拉下代码,编译也通过,但是emulator下桌面点击图标都没反应,也不报错,这原因何在?当在emulator中点击运行一个程序结果毫无反应时:主要有以下几个原因

      ①缺相应的dll库,也许你的工程要用到很多自己写的dll库,结果缺失或者拷贝不到位,导致exe无法找到,从而启动不了。

      ②版本不对,比如原本开发是用的qt-mobility1.0.2, 结果你安装的开发环境是qt-mobility 1.1.0。 结果就可能启动不了~~你可能会说了:不是高版本要兼容低版本吗?按道理说是这样的,但是NOKIA开发的一些东西确实··就像上边说的这个··所以这个还是要注意的。

      ③修改程序名字。比如:原本你的程序名字为ABC,结果中途你修改成DEF, 二者由于UID没有修改。结果你编译新的后打开模拟器,会发现程序名字还是ABC,这个时候点击ABC是可能不会有反应的。如果编译的是模拟器版本,有人会说:我去epc/release/winscw/udeb下把ABC.exe给删除,而后编译不就OK了?实则不然,有可能点击还是没反应。打开注册表,你会发现:这个ABC.exe还是注册了的,把其从注册表中删除是不是就万事大吉了呢?你再编译,刷新注释表,你会发现:ABC.exe怎么又出现了?所以这个也不彻底!最彻底的,你去epoc目录下搜索:ABC 把所有搜索到的文件全部删除! 这样再编译你会发现:在模拟器中的ABC彻底消失了,而DEF会出现并且点击顺利打开。原因在于:symbian会产生很多临时中间文件,而且不会clean掉,所以最好也自己隔断时间就来手动删除下,就当清理空间了。

     ④程序的能力不够。

     ⑤程序的能力顺序有问题,比如:你的程序是1个exe 2个dll。 如果其依赖顺序为dll A 依赖与 dll B ,而exe依赖于 A和B 。 那么:在三者的能力上: exe <= A <= B 才行! 亦即:底层的能力要大于等于高层。  网上很多说法都是大于,其实等于也可以! 如果你图个省劲,可以统计下程序用到的所有能力,而后将每个dll和最终的exe都赋予这个全部能力即可!

     ⑥缺资源,比如你程序重要读取一些配置文件或者声音文件,结果你没有把这些文件拷贝到epoc底下对应目录中,那么也会无法启动。最好把模拟器的资源拷贝和真机的资源拷贝到写到pro文件中,这样就不会出现该问题了。

 

    2: 对于qt-mobility,目前一直一直是beta版,中间问题多多,我们原因也使用了mobility来获取接入点信息,但是中间出了匪夷所思的问题,追了若干天才发现是mobility的问题。所以:这个东西目前是极其容易出问题的,建议慎用。(该bug后续会和别的Bug一起整理出来)。

 

    3:关于信号槽

       这个东西能不用则不用,一则其效率比函数调用会低,二则无法人为控制!很容易出现一些莫名其妙的问题。比如:我们用socket时:往网络中写数据调用write. 其是先由程序员调用write函数写到device中,而后系统会帮我们将之写到网络上。 从帮助文档上看,它提供了两种方法来判断当前有没有往device中写成功,一种是写成功后会发送一个byteWritten()信号,一种是直接查看write()函数的返回值,失败则返回-1,成功则返回写成功的数据的大小。  原本我们工程中使用了前者的方法,然后收到这个写成功的信号后我们会在其slot中做后续的操作来继续发数据,但是后来运行发现:怎么着数据也发不完整,结果就永远收不到反馈,程序就一直卡死在这里了! 后来追才发现这个信号一直没收到,查了一下才转而使用后者方法,结果跑起来很顺畅!完美解决!

       所以说:信号槽这个东西还是不太靠谱的!不建议使用!能不用则不用!更多的尝试使用函数调用,函数指针,observer模式来解决问题。

 

 

   4:很多人喜欢用UI Designer来绘制界面,怎么说呢,这个东西适合初学者,不建议高阶者使用,因为其产生的代码没有经过优化,比如:你摆上10个button,用Designer生成的代码中它真的会给你new 10次,而不会优化成一次new一个10大小的数组。 这些优化也许你觉得不重要,但是在移动设备上,其资源如此有限的情况下就很重要了!所以:这个东西还是不要用的好,既没有代码优化,也不灵活。

 

 

   5:关于编译器.

      symbian下编译器主要是gcce和arm。 二者又都分debug和release版本。我们开发中会遇到很多很有意思的问题,比如:在gcce编译器下:debug没有crash,但是release版本却有问题。 或者放过来。  遇到这种问题主要从下边角度考虑:

      1:release崩溃,debug没问题。 二者优化手段不一样,像成员变量的初始化,如果你没有手动初始化,debug会给你置0,但是release不会,其会给你初始化个随机数。  所以:遇到这种情况首先去挨个查看你的成员变量有没有都进行初始化操作!

      2:debug崩溃,release没问题.  这个情况就多了,主要还是qt的bug导致,当然也不排除其他问题。

      所以建议大家还是找文章查看下这两种编译器到底有什么区别,在写代码时尽可能不要让在二者编译下表现不一致即可。前期功课要做足

 

     如果由条件,建议还是使用arm编译器,不过qt要求版本挺高的。使用该编译器估计很多我们遇到的问题都会消失。

 

 

   以上是一些大方面的问题,至于编程上的细节性的一些东西,后续还会总结。

 

 类似资料: