之前说过想用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去的。
Tag Archives: Android
嵌入的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,囧!
木马机,电子书
有个同事,平时看我在公司里用手机连公司的WIFI,很是眼热,一直问我怎么用。我就告诉他,要装个ProxyDroid,而且手机得root先。这样持续了将近1个月,今天他突然跑过来对我说,都怪你都怪你,现在我的手机刷得只剩下闹钟了。原来他的HTC G12昨天被他用什么一键root软件强行root,结果不能启动WIFI了。于是今天中午和另一个同事一直在OF外面折腾这手机,希望能恢复WIFI。结果还是没有什么进展,而且最后从网上看到,似乎他的G12是所谓的木马机,笑死了。
今天看到,豆瓣推出阅读器了,除了Web版和iPad版,毫不意外地有Kindle递送服务。说起Kindle,之前有一段时间我非常想买一个电子书,当时只考虑了1000出头的Kindle3和500左右的Bambook,不过好在每当一有这种强烈的购买欲望时,都有一股理性的声音说,你不是个爱看书的人!然后就拖到现在也没有买。自从上次去上海图书馆,亲自把玩了一会儿Bambook,非常庆幸自己没有一时冲动买了这么个设备,这页面切换的速度太慢了,效果太难看了,版式也很丑,啧啧!不知道Kindle到底怎么样,得找个地方也亲身去体验一下,才能决定到底能不能符合我的要求啊。
入了个Nexus S
一直想弄个Android机玩玩,虽然说很多厂商都在做,但一直只想过HTC或Nexus系列,现在看Nexus S不到2000块,还有4寸屏就很心动,纠结了几个星期了。周一的时候自以为搞定了那个bug,心情很好,打算好好犒劳一下自己,晚上回来就上淘宝拍了一个。直到周四才收到快递,昨天晚上回来把它root了,然后装了GAEProxy,装上了几个Twitter客户端。
只用了一天,给我的感觉不是很好。周四晚上突然就有点后悔,我哪有那么多时间来折腾这个玩意。在屋里联通的信号很差,对WIFI的接收能力也不怎么样,默认还没有设置Proxy的功能,需要root后装第三方软件才行,屋里那个无线路由器的信号时断时续。流量跑得飞快,昨天晚上到现在10个小时左右,WIFI流量跑了30MB左右,3G流量跑了20MB,这好像是因为用一GAEProxy的缘故,昨天白天10来个小时没用GAEProxy也差不多走了20MB流量。很多app运行了就不能退出了,即使强行杀进程,它也会自动再启动,囧了。
好吧,其实各有各的优点的,比如这样后台Gmail、Google Reader、Twitter等的推送就感觉不错。
开始进行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吧。