winx移植手记:支持dev-c++, mingw32
许式伟
2007-1-14
移植winx到gcc编译器,确实比
移植到Visual C++ 2003辛苦一些,花了我整整一天时间,还只是移植了
winx中的一个子库:
stdext(C++标准扩展部分)。感兴趣可到
这里下载。因为仍然是windows平台开发,我选择的是Dev-C++, mingw32。之所以是Dev-C++作为开发平台,是依据大家在《
WINX调查:您使用什么C++开发平台?》的反馈决定的。
考虑到现在已经比较晚了,我先简单把一些感受比较强烈的东西记一下:
- 总体说来,对模板编译的支持,gcc比Visual C++系列(包括Visual C++ 2005)好很多。有不少细节上的看起来非常愚蠢的手误,由于代码没有用到,VC++就无法检查出来,用gcc很快就原型毕露了。对于VC++这种不调用就不进行一般性的语法检查的做法,我一直持否定的态度。虽然这可能加快了编译速度,但是对库的提供者无疑是不利的。
- gcc对语法的检查比VC++严格,这有利于你编写更符合C++标准的代码。
以上是赞美的话,但是相对来说,问题似乎更多:
- Microsoft的调试器真的是无可匹敌。用惯了Visual Studio,用gcc/gdb的调试实在痛苦。
- 我太习惯看函数调用栈了,Dev-C++的调试居然没有函数调用栈,不知道是gdb不支持,还是Dev-C++没有做。
- 当我要看一个结构体的内容时,Dev-C++只是打印该结构体的地址,并不显示更详细的信息。例如当你调试到某个类成员函数时,希望看看this对象的总体状态,却苦于没有办法。
- mingw32似乎没有支持fastcall调用,这是一个莫名奇妙的错误。由于一开始我压根没想到调用方式的问题,耽误了我不少时间。由于winx中所有的函数调用都采用winx_call,它被定义为__fastcall。mingw32并不报告这是一个错误,但是程序的执行却产生了非法操作。尝试去调试函数调用的跳转却非常奇怪,跑到一个根本没有调用过的函数上去了。由于现象奇特,我意识到这可能是由于调用方式引起的,把winx_call定义为cdecl,问题得以解决。
- 后来我想到gcc中调用方式的写法和VC++不太一样,应该写成:__attribute__ (( fastcall)),但问题依旧。
- mingw32编译出来的exe有点大(与Visual C++相比)。同样的代码(控制台程序),VC++ 6.0编译是44k,mingw32编译出来是521k(Release版本)。
对于Dev-C++,总体感觉还可以,有以下几点觉得需要改进:
- Dev-C++的工程文件过于简单,不支持多种配置。
- 函数跳转。VC++配上Visual Assist,按Alt+G跳转习惯了,没有这个功能还真不习惯。不过这个功能确实不易做。
- Find in Files功能支持在工程中找,也支持在所有打开的文件中找,唯独少了我觉得最实用的:在一个目录中找。
我用gcc也算有一段日子了,但是Dev-C++是首次使用,有些结论可能是我认识不足所致。把它写出来,也是欢迎有经验的朋友可以指出其中的错误,也欢迎与我交流心得。
对winx感兴趣?请到这里下载。