因为项目需要,需要在Windows下用C开发。一直不喜欢Microsoft对IDE的过渡封装,因此在Visual Studio下坚持了2个月实在是忍耐到了极点。于是开始尝试用Eclipse+cdt。
首先遇到的问题就是安装。Eclipse3.3 + CDT4.x.x-master 居然存在严重Bug。害了浪费了整整两天时间,google了以后才发现大家都被这个问题困扰。直接改为Eclipse for C/C++ dev后才让编译工作顺利下去。
初期,编译器选择的是MinGW。可以说CDT与MinGW结合的相当具备可用性。几乎不需要任何配置,就可以立刻着手编码、编译、调试。
接下来的工作是将原来VC下写的代码移植到CDT+MinGW环境中。起初一些简单代码段的编译是非常容易的,只需要稍做修改,将诸如 #include "stdafx.h"、#pragma comment...注释掉即可编译通过。但随着移植工作的进行,一些比较复杂的代码段开始出现了问题,其中3个问题是比较严重的:
1、Unicode char*问题。VC在6版本的时候对Unicode 的处理欠缺考虑,因此用增加了_UNICODE预处理定义,同时配合_T()宏的使用。MinGW gcc编译这些代码时,出现了大量的错误提示和警告。多半都在TCHAR WCHAR的转换上。调试了半天,可运行编译结果的时候出现不稳定状况。
2、第二个是Link Lib的问题。MinGW提供了大量必要的头文件和Lib库,基本上能够完全兼容VC原有代码的。但有少部分VC对ANSI C的扩展未实现。这在特定的情况下给移植工作带来了很大的工作量,我不得不一层层的跟踪进去补充。耗费了很多精力。
3、第三个问题是目前看起来最严重的。这个项目要求编译后的exe文件要非常微小——少于100K。但MinGW在这方面显出了明显的弱势。一个简单的Hello World 的C++项目Release编译后也要达到800K左右,strip后也只减到200K。难以满足我们的要求。
鉴于上面的原因,我开始尝试Eclipse +CDT + VC编译器的结合。CDT几乎没提供任何针对VC的缺省选项和配置。只在Error parsers处提供了个CDT Visual C Error Parser。因此,不得不手工配置了。
经过很短的尝试,就配置成功,很轻松。方法如下:
- 创建C/C++项目时,选择Makefile project->Hello World C++ Project。注意:Toolchain 要选择--Other Toolchain---。
- 项目创建好后要修改自动生成的Makefile文件。最关键的是下面两个修改:
- 将“OBJS = Test.o" 改为 "OBJS = Test.obj”。因为VC的编译器cl自动识别的目标文件时*.obj而不是*.o,这是与Gcc的重要区别。否则你编译的时候会出现“NMAKE : fatal error U1073: don't know how to make”错误提示。
- 将“clean:" 下一行的rm改为erase。erase是windows自带的删除命令。
- 右键点开项目Properties设置窗口,选择C/C++ Build,钩掉Use default build command的checkbox。在Build->Build command处将make改为nmake。(nmake就是vc的“make”)。
- 选择C/C++ Build->Discovery options,在Compiler invocation command处,将gcc改为cl。(cl是VC的编译器)
- 选择C/C++ Build->Envionment,新创建3个环境变量:
PATH=C:\Program files\Visual Studio\VC98\Bin;C:\Program files\Visual Studio\Common\MSDev98\Bin
LIB=C:\Program files\Visual Studio\VC98\Lib
INCLUDE=C:\Program files\Visual Studio\VC98\Include
注:这里的C:\Program files\Visual Studio\就是你的VC安装路径
好了,大功告成。
相同的代码用VC编译后的大小只有40K,符合要求了。只是编译速度较MinGW的gcc慢了很多。之后我又用Visual Studio 2005的C++编译器尝试过,配置方法完全相同(改改安装路径就可以了)。但编译速度提高了非常多。甚至超过了MinGW的gcc。(Visual Studio 2005的C++编译速度一直口碑不错)。
从目前来了,在Eclipse CDT中采用了vc编译器后,代码移植工作非常顺利。主要的工作都是花在编写Makefile上,而我一直认为自己写Makefile是件令人愉快的事,这能让你自己控制编译的过程。
Eclipse CDT+VC的一个缺点是无法使用GDB进行DEBUG了,这对我来说无所谓,反正频繁使用gdb来调试代码是个不好的习惯。
工程还在继续,待有了新心得有了空,再记下来。
------------------------------------------------------------------------------------------------------------