现在的位置: 首页 > 综合 > 正文

winx移植手记:支持dev-c++, mingw32

2013年05月29日 ⁄ 综合 ⁄ 共 1324字 ⁄ 字号 评论关闭

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感兴趣?请到这里下载。

抱歉!评论已关闭.