Linux手机DIY.库文件专题.兼容性问题

Linux手机DIY.库文件专题.兼容性问题

草木瓜  于 2006-11-9


一、序

  软件移植过程的兼容性问题由来已久,因素也是十分复杂和多样。在实际过程中却有发现了一个更费解的现象,还是可恶的浮点问题!

二、重要提示

    为了方便更好的理解本文,提供下面链结。
    全系列的文章地址,手机应用开发专栏:http://blog.csdn.net/liwei_cmg
    相关的重要成果的下载地址:http://play.younet.com/view.php?tid=24045

三、初识兼容性问题

  夏新E600和飞利浦968手机系统是十分相近的,内核版本信息也是一致的,
不过即便这样,在模拟器移植过程中,E600使用968的QT库,都会有按键问题。
显然这是硬件有所不同的原因。
  Qnes模拟器能不能在E680上用呢,事实是不太可能的,因两者硬件差异太
大。以下描述我在E680上运行Qnes的提示信息。

  我将一些夏新E600本身特有lib文件加上后,仍然使用E680本地的QT库,设
置好环境变量,运行会出现:
  # ./r qnes
  ./qnes: relocation error: /mmc/mmca1/qnes/libcec.so.0: undefined
symbol: _ZThn184_N10QPopupMenu10updateItemEi
  说明自带的QT库缺少函数。我把E600的libqte-mt.so.2,和fonts复制过去,
运行倒是可以,只不过是不正常的运行,提示如下:

  ======== 240 x 320 x 16
  Default2: Cannot open /dev/ts (No such file or directory)
   ==========================================================
  theme config file [../Settings/theme/010Gray.conf] doesn't exist!
  JPEG parameter struct mismatch: library thinks size is 376, caller expects 372
   QImage::measure fail to guess image format
   csmCheckLimited : csm size 0/655360
   csmConstruct : csm info
   start 0x40551000
   size  655360
  could not open for writing `/Settings/cec.conf.new'
  QCopChannel: no client registered for channel CEC/Desktop, not sending stopStartupAnimation()
  ...
  QCopChannel: no client registered for channel CEC/IdleManager, not sending hideInputMethod()
  ...

  在E680手机上倒是显示了个新界面,并有英文的Load和Back。通过提示可以
清楚看出因两者硬件的差异生成兼容性的问题。不过也证实了上篇文章的推论,
浮点格式不同,最多是浮点运算有误,但是程序还是可以链结运行的。造成什么
Segmentation Fault的错误,还是直接来源于硬件。

  如我把E600的sysinfo放在E680运行会有如下提示:
  
  ======== 240 x 320 x 16
  Default2: Cannot open /dev/ts (No such file or directory)
   ==========================================================
  theme config file [../Settings/theme/010Gray.conf] doesn't exist!
   QImage::measure fail to guess image format
   csmCheckLimited : csm size 0/655360
   create csm : exist
   csmConstruct : csm info
   start 0x40871000
   size  655360
  could not open for writing `/Settings/cec.conf.new'
  Can't make QGfx for null pixmap
  
  QPainter::begin: Unable to get graphics context
  Segmentation fault
  
  这个Segmentation fault可能来自于显示设备的,具体原因不详,如做
反汇编处理,会了解更多的信息。

四、测试简单的浮点运算

  编译环境:
  VFP gcc-3.3.2 glibc-2.3.2 binutils-2.15 kernel 2.4.20
  FPA gcc-3.4.0 glibc-2.2.5 binutils-2.15 kernel 2.4.19

  先简单写个命令行程序如下:
  int main()
  {
  float fValueA=1.9;
  float fValueB=2.8;
  int iValueC=8;
  int iValueD=9999;
  printf("Hello!My E680G!/n");
  printf("TestValue(4.7):%f/n",fValueA+fValueB);
  printf("TestValue(9.9):%f/n",fValueA+iValueC);
  printf("TestValue(10007):%d/n",iValueC+iValueD);
  return 0;
  }

  1.vfp soft fp gcc-3.3.2 glibc-2.3.2 编译
  arm-linux-gcc -o hellocmdvfp hello.c
  
  2.fpa soft fp gcc-3.4.0 glibc-2.2.5 编译
  (加参数 -msoft-float 也是完全一样的)
  arm-linux-gcc -o hellocmdfpa hello.c
  
  ------------------------------------------------
  E680运行结果:
  
  # ./hellocmdvfp
  Hello!My E680G!
  TestValue(4.7):4.700000
  TestValue(9.9):9.900000
  TestValue(10007):10007
  
  # ./hellocmdfpa
  Hello!My E680G!
  TestValue(4.7):-2.000000
  TestValue(9.9):-2.000000
  TestValue(10007):10007
  
  FPA虽然有软浮点,但浮点运算依然出错。
  
  ------------------------------------------------
  E600和968的运行结果:
  
  #./hellocmdvfp
  Hello!My E680G!
  TestValue(4.7):-2.000000
  TestValue(9.9):-2.000000
  TestValue(10007):10007
  
  #./hellocmdfpa
  Hello!My E680G!
  TestValue(4.7):-2.000000
  TestValue(9.9):-2.000000
  TestValue(10007):10007
  
  -------------------------------------------------
  
  出乎我的意料,在E600上,浮点运算居然全出错,后来偶然间用VFP格式
的arm-linux-g++编译:
  arm-linux-g++ -o hellocmdvfp+ hello.c
  
  #./hellocmdvfp+
  Hello!My E680G!
  TestValue(4.7):4.700000
  TestValue(9.9):9.900000
  TestValue(10007):10007
  
  在E600上居然又运行正确,这令人十分奇怪。于是我再用FPA格式这样编
译:
  arm-linux-g++ -o hellocmdfpa+ hello.c
  
  因为是gcc.3.4.0版本,会提示libstdc++6.so.0和libgcc_s.so.1缺少。
加上库文件后运行结果如下(E680,E600,968结果完全一样):
  
  #.hellocmdfpa+
  Hello!My E680G!
  TestValue(4.7):-2.000000
  TestValue(9.9):-2.000000
  TestValue(10007):10007  

  显然都是错误的。


五、总结 
 
  VFP格式在E600,968上运行,可以说是没有浮点BUG的。不过FPA却总
有问题。VFP编译环境在编译过程中不能兼容E600,968本身的库文件,所
以才要用FPA的编译环境。
  浮点这个问题比较让人费解,还须要做进一步研究。


 

你可能感兴趣的:(linux,image,File,手机,qt,fonts)