STL是一个标准、各个商家根据这个标准开发了各自的STL版本,而在这形形色色的STL版本中,SGI STL无疑是最引人瞩目的一个。这当然是因为这个STl产品系出名门,其设计和编写者名单中,Alexander Stepanov和Man Austern赫然在内,有两位大师坐镇,其代码水平自然有了最高保证。SGI STL不但在效率上一直名列前茅,而且完全依照ISO C++之规范设计,使用者尽可放心。此外,SGI STL做到了thread-safe,还体贴地名用户增设数种组件,如hash,hash-table,hash-multimap,slist和rope容器等等。因此无论在学习或者实用上,SGI STL应是首选。
无奈,SGI STL本质上是为了配合SGI公司自身的UNIX变体IRIX而量身定做,其它平台上的C++编译器想使用SGI STL, 都需要一番周折。著名的GNU C++虽然也使用了SGI STL,但在发行前已经调试整合,一般用户,特别是Windows平台上的BCB/VC用户要想使自己的C++编译器与SGI STL共同工作,可还是一件容易的事情。俄国人Boris Fomitchev注意到这个问题之后,建立一个免费提供服务的项目,称为STLport,旨在将SGI STL的基本代码移植到各主流编译环境中,使各个编译器的用户都能够享受到SGI STL带来的先进机能。STLport发展过程中曾接受Matt Austern的指导,发展到今天,已经比较成熟。最新的STLport 4.0,可以从www.stlport.org免费下载,zip文件体积约1.2M,可支持各主流C++编译环境的移植。BCB及VC当然是主流编译环境,所以当然也得到了STLport的关照。
1. 登录www.stlport.org,下载最新的STLport版本,解压到自己喜欢的位置。 最新版本STLPort5.2.1是2013.5.13发布的,由于此版本中对c++11的一些特性支持还不是特别友好,在使用时需要慎重考虑这一问题。根据soureforge中提到,新版本5.3还在开发进行中。2. 打开开始菜单下Visual Studio 2013下的Visual Studio Tools下面的命令环境编译工具-Visual Studio Command Prompt(2013). 进入解压目录,依次运行 cd \STLPort-2.5.1
查看confibure.bat配置文件,其支持visual studio编译器最高版本为visual studio 2008,即msvc9,默认的编译操作平台是windows xp, 这里我们就选择默认的(我的操作系统是windows8.1),如果要查看更多的编译选项,可查看configure.bat文件。
如果使用错误的编译器版本,会出现如下错误:
configure.bat msvc9 cd build/lib nmake -f msvc.mak clean install 但编译会出现错误:
![](/images/cppblog_com/deajosha/QQ截图20150510154014.png)
打开文件stlport\stl\_cstdlib.h,定位到第158行代码,并添加如下语句:
#if !defined(_STLP_MSVC) || (_STLP_MSVC < 1600)
inline
_STLP_LONG_LONG
abs
(_STLP_LONG_LONG __x) {
return
__x < 0 ? -__x : __x; }
#endif
注意_STLP_MSVC 和 _MSC_VER 是一个东东,就是VC的版本号。
在visual studio2013下,这样编译结束后,在项目中引用,会提示如下错误:
![](/images/cppblog_com/deajosha/QQ截图20150510204252.png)
解决办法是:
打开stlport\stl\_cmath.h,找到hypot函数定义处,删除如下代码即可,如下所示:
![](/images/cppblog_com/deajosha/QQ截图20150510222403.png)
这个过程编译时间稍长,大约需要数分钟。编译完成后会自动将编译出的*.dll和*.lib复制到STLport\lib和STLport\bin目录下,其中包括静态库和动态库,之后可将STLport\build\lib\obj目录删除以节省硬盘空间。把stlport的lib,include目录添加到visual studio编译器中, STLport就可以使用了。
4. 在使用STLport过程中,可以使用不同的宏在决定使用动态链接或是静态链接STL,
#define _STLP_USE_BOOST_SUPPORT // stlport与boost配合使用
#define _STLP_USE_STATIC_LIB // 静态链接stlport
#define _STL_USER_DYNAMIC_LIB // 动态链接stlport
#define _STL_DEBUG // debug调试模式