写C++程序的人不可能不熟悉STLport,同样,对GNOME略有心得的人一定知道libsigc++的大名(连Bjarne Stroustrup都对libsigc++大为推荐)。一个是STL的跨平台优秀实现,一个是callback的完整包装。这两者简直就是写GUI程序的绝妙组合,但如何在Windows平台上使用它们却是大费周折。
STLport对Windows上主流的compiler都支持得非常好,如Borland C++和Visual C++的许多版本都有现成的makefile,你要做的可能就是简简单单输入一个nmake -f xxx.mak就可以了。但有一个缺点,除了STLport,其他都是要付费的。
libsigc++在传统上就是一个linux的库,由于他用到了很多C++语言比较新的特性,如partial specialization等,在Windows上只支持Visual .NET 2003。这又是一个无法轻松拥有的软件。
其实Microsoft有一样好东西一直没有进行宣传,所知者甚少,那就是DDK。写device driver的程序员一定知道他,但未必真的去看看里面有些什么。其实从Windows XP DDK开始,C library和Windows SDK都包含在里面了,并且不像早期的DDK,如Windows 2000,需要使用VC6的C compiler,他已经自带了一个很棒的C compiler,对C++特性的支持非常好,远远超过了VC6,甚至Visual.NET 2002,基本上和Visual C++.NET 2003差不多。
MSDN中对Visual C++.NET 2003比以往增强的特性可以在这里看到。
由于一些历史原因,SDK和C header没有在include目录下,而STLport早就考虑到了这一点,在stl_msvc.h中,我们可以通过一些preprocessor来调整这些header的位置。
另外,MS C LIB也没有定义C standard中的hypot函数,取而代之的是_hypot,这一点难不倒我们,可以在stl_msvc.h中同样用preprocessor来修复它。
所有这些完成后,用vc71.mak就可以了。编译,成功!
libsigc++对C++ header的使用也非常正规,完全符合C++ standard。其中提供的Visual C++.NET 2003编译环境我们当然无法使用,但sigc++config.h却可以照用不误,但需要把SIGC_API定义成空。我们还得写个Makefile来编译所有的C++文件。当然,我们需要在makefile中包含STLport和DDK的SDK/CRT路径。小心调整一下编译选项,成功了!
有一点需要注意,由于STLport在编译debug版时,把_STLP_DEBUG打开了,所有的iterator在操作之前会有一些测试,libsigc++的编译选项必须和使用STLport和libsigc++和编译选项相同才可以,不然会有连接错误。