用Intel C++编译Qt失败

  之前说过想用Intel C++编译Qt来着,于是从VeryCD上找到Windows、Mac和Linux的Intel C++安装镜象不辞辛苦地下载下来安装。结果让人很沮丧啊。
  在Windows 7中,无论编译64位版本还是32位版本,都会编译失败,我怀疑是因为Intel C++用了Visual C++的头文件引起的问题,但是我直接用MSVC2010来编译64位的Qt,虽然也是编译失败,却跟Intel C++报的错误不同,好像C++11标准的问题,在Webkit部分中有类名为nullptr,这个名字在C++11中作为保留字了。也不知道那些用MSVC2010编译成功的是用了什么参数。至于使用MSVC2008的配置,我就没兴趣编译了,因为我不喜欢MSVC2008的SxS。
  然后在Mac中编译,32位版本也是编译失败,64位版本编译倒是全部通过了,但貌似make install不完整,那些头文件就没有复制过去,还缺了些什么不知道,反正直接把Qt源代码目录中的include目录复制过去是不能用的。于是也放弃了。
  后来么,在Windows上下载了32位和64位的TDM GCC,编译了两个晚上才编译出来,话说那个-nomake “demos examples docs”参数不起作用啊。试了试编译Ninayan 64位,可以运行。
  这两天看到Nokia的Qt论坛上有个叫Qt4iOS的人,说他做的Qt for iOS插件就要可以正式发布了,好期待啊。又看到有人说,Necessitas虽然还在Alpha版本,但已经可用性很高了,我看了下,现在居然已经提供4.8.0版本的for Windows/Mac/Linux的SDK了。不过在Mac上安装好后想编译Ninayan才发现,源代码还需要做些修改,比如源代码中通过预定义宏只识别了Windows/Mac/X11/Symbian/Maemon,但是这个Android不知道是什么宏,不知道上哪去查点资料看看。
  于是最近还在网上看到的消息,是说Windows Phone的下个版本会支持C++开发,如果这样的话,Qt也会很快就支持WP开发。啊,如果Qt真能用于Android、iOS和Windows Phone的开发,那就太牛逼了。说实话,如果这些port的质量可以的话,只要价格不是太离谱,我应该会买这license去的。

嵌入的CLR引用销毁的C++对象的问题

  今天彻底打酱油了,我们shared dev team也只剩下我,老大和Jason三个人了。因为晚上2点才睡,才睡了不到6个小时,于是下午就坐在办公椅上睡了近1个半小时,最后是被他们讨论一个bug的声音吵醒的,啊哈哈,老大还说让我看一下,现在只有我在这方面有经验了,我囧,我完全没经验的说,后来还是Sherman厉害啊!
  再后来,就跟老大讨论了一会儿C++ singleton的实现,以及跨DLL数据引用等等。问题是有个Watson的bug,我从一次crash的call stack中发现,程序在调用_exit后,该程序中的static object应该是已经瞬间被无声息地干掉了,所谓无声息的,就是说,连它的析构函数都没被调用的。但这时嵌入的CLR还需要做一部分扫尾的工作,而恰恰是这扫尾工作又反过来调用了那个貌似已经被干掉的static object,于是程序crash了。当然这只是我的猜测,我猜测嵌入的CLR就是要生存周期长一点,于是一直在代码中试图找一下它是怎么从C++端嵌入CLR的,然后怎么用CLR的。我发现的情况貌似是这样的,先用Managed C++写了一个dll,这个dll可以在DllMain,还可以导出函数,而据我前些天才知道的知识,.NET编写的普通的DLL形式的assembly跟原本的DLL不一样,没有DllMain的。而这个DLL通过导出函数返回一个对象的指针,这个exe程序通过GetProcAddress获取导出函数,再调用这导出函数获取对象指针。这个返回的对象呢,是个CLR Bridge,也就是说,通过这个对象,可以从C++端创建CLR中的对象,调用CLR对象中的方法等等。也就是说,从代码中,我没看到Jeffray Richter在《CLR via C#》中说的那种CLR host的方法。现在我仍然在怀疑,是不是我代码没看全,但我确实之前也在整个代码目录下搜索文本,没有那几个用于host CLR的API调用。似乎有点跑题了。然后我就跟老大说了一下我发现的这些情况,略微讨论了一会儿,老大表示自己也不知道,唔,其实我也不指望他知道,只是有这么一种想跟人分享自己的发现的欲望而已。基本上,我就觉得这很可能是此bug的root cause了,但老大说可能只是个cause,而不是root cause,好吧,其实就是缺少验证而已。一个比较有说服力的验证方法是自己用C++写个小程序,然后用相同的方法调用CLR中的代码,最后能制造出同样的crash,只是我最近木有动力去做这些事而已。另外就是,即使确定了这是个root cause,简单地说来,这个root cause应该就是对象销毁的顺序不对,这是可以肯定的,但之后也不好fix,因为这个程序实在太庞大了,有很多对象,然后引用关系也很复杂,以我目前对它的了解程度,根本没能力对理顺这个关系,于是也就fix不了了。而且还有个另外的问题是,那个static object是该程序中用于实现singleton的一种方式,我觉得比较奇怪,老大说,这是为了应付多线程的情况。还有种应用多线程的singleton实现方式是在create instance时加锁,唔。关于这个话题,在前段时间看到TopLanguage group中有个讨论,提到boost中某个库中的singleton实现,貌似很干净的实现,不用锁,也不是static object,能适应多线程,囧,具体的不记得了,貌似boost中有好几个子库中都有自己的singleton的实现,得再去看看代码才行,另外好像《Modern C++ Design》里也有对多线程singleton实现的讨论,春节放假看看去。
  话说,今天还看到Mono,发现除了有Mono Touch外还有Mono for Android,不过免费试用版都只能在emulator上跑,最便宜的个人版license也要399刀。不禁大骂Qt的不给力,为毛只能为Symbian和MeeGo用,Android port至今还在alpha 3,beta和rc都遥遥无期,更别说正式release了。而iOS port则压根貌似没人做了,叹气。我在想,如果Qt现在如果有Android和iOS的port像现在的Mono那么高的成熟度,我说不定真会去花这钱买license,囧!

开始进行Android和iOS开发

  盼Qt移植到Android和iOS上是有点盼不到了,尽管都有开源社区的人在进行相关的工作,但实在进度太慢,等不及了。还是老老实实去学JAVA和Android SdK,Objective-C和Cocoa Touch吧。
  昨天花了半个晚上,在Windows XP SP3和Mac OS X 10.6.7上配置好了Android开发环境。安装配置的过程非常简单,基本上每本讲Android开发的书上都有会那么些篇幅讲这些内容,而作为开源工具集合而成的开发方案,能做到这样程度的方便,已经相当不错了。而且Android开发环境中有一点我觉得非常厚道的是,它的emulator可以直接安装正式发布的app的apk包来运行,这给开发者带来极大的便利,可以直接体验别的app,而且不用担心有害代码。而无论是iOS还是Symbian都不行。
  今天下午在网上找了一下Xcode4版本无证书进行真机调试的信息,还真的找到一篇文章,操作也不是很复杂,最后在我的Xcode 4.0+Mac OS X 10.6.7+Touch 4.3.3环境中实验成功,真是开心啊。
  这样基本上解决了Android和iOS开发的绝大部分问题,至少deployment是基本解决了。开始移植Ninayan吧。

装goagent for iOS

  回家了,可能还是因为长假的缘故,两个收费站都堵了好久,几乎每个服务区里加油的车都是排长队的。
  下午又看了一遍goagent for iOS的wiki page,然后开始折腾。花了约2个小时把touch装上了goagent,感觉就是速度似乎比GFWInterceptor要慢,其他没什么区别。晚上又折腾了下,把iPad也装上了goagent,这样Flipboard可以添加上Facebook账号了。好像换了goagent唯一的好处是可以比较完美地上Facebook了,囧。嗷嗷嗷,更想去弄个Android机了!
  让我觉得比较郁闷的是,在Mac OS X上用goagent,似乎添加的SSL证书不起作用。于是Ninayan在Mac上就不能连接Twitter了,纠结了。

同步谷歌日历、联系人和邮件

  这些天发现可以通过MS Exchange把Google Calendar,Google Contacts和Gmail同步到iOS设备上,还可以同步到Nokia C7上,于是一直在折腾。
  有时候同步会有延时,还有,发现如果Google Contacts里的生日只填月日,不填年份的话,貌似不能正常识别并使用,比如在iOS上会把联系人的生日那天在Calendar上标记出来,但没有年份的话是不会标记的,因为压根没有从Google Contacts同步过来。
  除了联系人和日历外,邮件也是很有用的,用Exchange在线维护感觉很好,不过本来想的是Gmail可以通过pop3来收取其他邮箱的邮件,但是很头痛的发现它连接不到网易邮箱的pop3服务器,总是报连接超时,但连接hotmail没有问题,而用hotmail通过pop3连接网易邮箱又是可以的!这谷歌和微软在对华公关上做得差距有点大,当然可能是因为微软是得罪不起,而谷歌没这么不可或缺。于是只好先用hotmail把网易的邮件收下来,再用Gmail把hotmail都收过来,然后根据收件人把邮件打上不同的label。
  另外有个问题是,我在电脑上,无论是XP还是Mac上都配置不好客户端的Exchange连接,Outlook 2003,Foxmail 7.0以及Mac Mail,都说连接不上m.google.com,这就很头痛了!要继续研究下。

Ninayan W.I.P.(28)

  终于大体上对iOS有一个模糊的轮廓了,做一个没有特别的技术点或者奇异的UI的app的话,基本上靠翻书和查手册应该能搞定了,就像几个月前开始用QML写Ninayan一样。
  昨天被ObjC和Cocoa Touch给联合调戏了,我居然以为任何对象都可以随便release。实际上release了不该release的对象后,就会出现各种古怪的问题。
  另外有件让我觉得比较蛋疼的事,苹果居然为了用ObjC实现一个singleton而提供了一段官方的样板代码,囧死了。