在 Borland C++ 及 Visual C++ 环境中使用 STLport
在 Borland C++ 及 Visual C++ 环境中使用 STLport
孟岩
侯捷注:本文承作者孟岩先生应允,
转载于此以飨台湾读者,非常感谢。
未得孟岩先生之同意,任何人请勿将此文再做转载。
以下红色为译注,紫色为侯捷个人认为宜再斟酌之处。
浅蓝色是侯捷个人阅读时的神秘标记。
本繁体文系直接转码,并未将大陆惯用术语转换为台湾惯用术语。
--------------------------------------------------------------------------------
STL是一个标准?各商家根据这个标准开发了各自的STL版本。而在这形形色色的STL版本中?SGI STL无疑是最引人瞩目的一个。这当然是因为这个STL产品系出名门?其设计和编写者名单中?Alexander Stepanov和Matt Austern赫然在内?有两位大师坐镇?其代码水平自然有了最高的保证。SGI STL不但在效率上一直名列前茅?而且完全依照ISO C++之规范设计?使用者尽可放心。此外?SGI STL做到了thread-safe, 还体贴地为用户增设数种组件?如hash, hash_map,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注意到这个问题之后?建立了一个free的项目?称为STLport?旨在将SGI STL的基本代码移植到各种主流编译环境中?使各种编译器的用户都能够享受到SGI STL带来的先进之处。STLport 发展过程中?曾受到Matt Austern的亲切指导?发展到今天?已经比较成熟。最新的STLport 4.0?可以从www.stlport.org免费下载?zip文件体积约1.2M, 可以支持向各种主流C++编译环境的移植。BCB及VC当然算是主流的编译环境?自然得到STLport的关照。但据笔者实践来看?配置过程中还有一些障碍需要跨越?本文即旨在详细指导读者在Borland C++Builder 5.5及Visual C++ 6.0 环境中配置STLport。
首先请从www.stlport.org中下载STLport 4.0的ZIP文件?文件名stlport-4.0.zip. 然后利用WinZip等工具展开。生成stlport-4.0目录?该目录中有且仅有一个子目录?名称亦为stlport-4.0?不妨将整目录拷贝到你以为合适的位置?然后改一个合适的名字?例如配合BCB的?可以叫STL4BC?等等。
下面分成BCB/VC两种情形来描述具体过程。
Borland C++Builder 5
Borland C++Builder5中所带之C++编译器是5.5版本?在当前较主流的Windows平台编译器中?对于ISO C++ Standard的支持是最完善的。用它来配合SGI STL相当方便?也是笔者推荐之选。没有此开发工具的读者?可以到www.borland.com上免费下载Borland C++ 5.5编译器的一个精装版?该精装版体积为8.54M?名称 freecommandlinetools1.exe?乃一自解压安装文件。可在Windows中执行它?
安装到合适的目录中。展开后体积50M。
以下描述中?假定你使用的Windows装在C:\Windows目录。如果你有BCB5?我假设装在C:\Program Files\Borland\CBuilder5?如果你没有BCB5?而是使用上述的精简版BCC?则假设安装在C:\BCC55目录中?而STLport原包置于C:\STL4BC。
C:\STL4BC中应该有以下内容?
<目录> doc
<目录> lib
<目录> src
<目录> stlport
<目录> test
文件 ChangLog
文件 Install
文件 Readme
文件 Todo
同时确保C:\Program Files\Borland\CBuilder5\Bin或C:\BCC55\Bin在你的Path环境变量中。
笔者推荐你在安装之前读一读Install文件?其中会讲到如何避免使用SGI提供的iostream库。如果你不愿意使用SGI iostream?STLport会在原来编译器自带的iostream库外加一个 wrapper?使之能与SGI STL共同合作。不过SGI提供的iostream库标准化程度好?跟本家的 STL代码配合起来速度也快些?所以笔者实在想不出什么理由不使用它?在这里假定大家跟笔者一样?乐于使用SGI iostream库。有不同看法者尽可以按照Install文件的说法调整。
下面一步步来?
0. 本次配置任务均在DOS命令状态下完成?请先从“开始”-->“附件”菜单中选中MS-DOS方式?打开一个DOS窗口。
1. 到C:\Program Files\Borland\CBuilder5\bin中?利用你顺手的文本编辑器修改两个文件?
file1: bcc32.cfg?改成?
-I"C:\STL4BC\stlport";\
"C:\Program Files\Borland\CBuilder5\Include";\
"C:\Program Files\Borland\CBuilder5\Include\vcl"
-L"C:\STL4BC\LIB";\
"C:\Program Files\Borland\CBuilder5\Lib";\
"C:\Program Files\Borland\CBuilder5\Lib\obj";\
"C:\Program Files\Borland\CBuilder5\Lib\release"
上面为了方便阅读用"\"符号将很长的一行折行?实际文件应该只有两行。
file2: ilink32.cfg?改成?
-L"C:\STL4BC\LIB";\
"C:\Program Files\Borland\CBuilder5\Lib";\
"C:\Program Files\Borland\CBuilder5\Lib\obj";\
"C:\Program Files\Borland\CBuilder5\Lib\release"
在C:\BCC55\BIN目录中?不存在这两个文件?请你自己用文字编辑器手工做出这两个文件来?内容与上面有所不同?如下
file1: bcc32.cfg?内容?
-I"C:\STL4BC\stlport";"C:\BCC55\Include";
-L"C:\STL4BC\LIB";"C:\BCC55\Lib";
file2: ilink32.cfg?内容?
-L"C:\STL4BC\LIB";"C:\BCC55\Lib";
2. 进入到C:\STL4BC\SRC目录中。
3. 执行命令copy bcb5.mak Makefile
4. 执行命令make clean all
这个命令会执行很长时间?尤其在老旧机器上?可能运行30分钟以上。屏幕不断地在显示
工作情况?有时你会看到好像计算机在反复地做同样几件事?请保持耐心?这实际上是在
以不同编译开关建立不同性质的目标库。
5. 经过一段漫长的编译之后? 终于结束了。现在你再执行命令 make install 这次需要的时间不长。
6. 来到C:\STL4BC\LIB目录?执行
copy *.dll c:\windows\system;
7. OK?大功告成。下面一步应该是检验一下事不是真的用上了SGI STL。rope是SGI STL提供的一个特有容器?专门用来对付超大规模字符串(string是细弦?而rope是粗绳子?可以想见rope的能力有多强)。
下面这个程序有点暴殓天物?不过也可以做一个小试验了?
//issgistl.cpp
#include <iostream>
#include <rope>
using namespace std;
int main()
{
// crope就是容纳char类型字符的rope容器
crope bigstr1("It took me about one hour ");
crope bigstr2("to plug the STLport into Borland C++!");
crope story = bigstr1 + bigstr2;
cout << story << endl;
return 0;
}
//~issgistl.cpp
编译 bcc32 issgistl.cpp
咦?怪哉?linker报告说找不到stlport_bcc_static.lib?到C:\STL4BC\LIB看个究竟?确实并没有这个文件?倒是有一个stlport_bcb55_static.lib。笔者发现这是STLport的一个小问题?需要将库文件的名字做一点改动?
copy stlport_bcb55_static.lib stlport_bcc_static.lib
这做法比较稳妥?原来的stlport_bcb55_static.lib也保留下来。以其他选项进行编译时?还可能会遇到类似的问题?只要照葫芦画瓢该名字就没问题了。
现在再编译?应该没问题了。可能有一些warning?没有关系。只要能运行?就说明rope容器起作用了?也就是说你的SGI STL开始工作了。
Microsoft Visual C++ 6.0:
Microsoft Visual C++ 6.0是当今Windows下C++编译器主流中的主流?但是对于ISO C++的支持并不尽如人意。其所配送的STL性能也比较差。不过既然是主流?STLport自然不敢怠慢?下面介绍VC中的STLport配置方法。
以下描述中?假定你使用的Windows装在C:\Windows目录。VC装在 C:\Program Files\Microsoft Visual Studio\VC98?而STLport原包置于C:\STL4VC。
C:\STL4VC中应该有以下内容?
<目录> doc
<目录> lib
<目录> src
<目录> stlport
<目录> test
文件 ChangLog
文件 Install
文件 Readme
文件 Todo
同时确保C:\Program Files\Microsoft Visual Studio\VC98\bin在你的Path环境变量中。
下面一步步来?
0. 本次配置任务均在DOS命令状态下完成?请先从“开始”-->“附件”菜单中选中MS-DOS方式?打开一个DOS窗口。
1. 到C:\Program Files\Microsoft Visual Studio\VC98中?利用你顺手的文本编辑器修改两个文件vcvars32.bat?其中有两行
set INCLUDE=%MSVCDir%\ATL\INCLUDE;%MSVCDir%\INCLUDE;%MSVCDir%\MFC\INCLUDE;%INCLUDE%
set LIB=%MSVCDir%\LIB;%MSVCDir%\MFC\LIB;%LIB%
改成?
set INCLUDE=C:\STL4VC\stlport;%MSVCDir%\ATL\INCLUDE;%MSVCDir%\INCLUDE;\
%MSVCDir%\MFC\INCLUDE;%INCLUDE%
set LIB=C:\STL4VC\lib;%MSVCDir%\LIB;%MSVCDir%\MFC\LIB;%LIB%
上面为了方面阅读用 "\" 符号将过长的一行折成两行?实际文件中还是一行。
修改完毕后保存?然后执行命令vcvars32。一切顺利的话应该给出一行结果?
Setting environment for using Microsoft Visual C++ tools.
如果你预设的DOS环境空间不足?这个BAT文件执行中可能导致环境空间overflow?此时应该在DOS窗口的“属性”对话框中找到“内存”页?修改“初始环境”ComboBox?改为一个较大的值?如1280或2048。然后再次开一个DOS窗口?运行vcvars32.bat。
2. 进入到C:\STL4VC\SRC目录中。
3. 执行命令copy vc6.mak Makefile
4. 执行命令make clean all
如果说BCB编译STLport的时间很长?那么VC编译STLport的过程就更加漫长。屏幕反反复复地显示似乎是同样的内容?请务必保持耐心?这实际上是在以不同编译开关建立不同性质的目标库。
5. 经过一段漫长的编译之后? 终于结束了。现在你再执行命令
make install
这次需要的时间不那么长?但也要有点耐心。
6. OK?大功告成。下面一步应该是检验一下事不是真的用上了SGI STL。跟上面BCB的过程差不多?找一个使用了SGI STL特性的程序?比如使用rope, slist, hash_set, hash_map等容器的程序来编译。注意?编译时务必使用下面的格式?
cl /GX /MT program.cpp
SGI STL中大量使用try..throw..catch?VC缺省情况下不支持此语法?/GX是要求VC++ Compiler打开对异常处理语法的支持。/MT则是要求VC的linker本程序obj文件与libcmt.lib连接在一起?因为SGI STL是thread-safe的?必须以multi-thread形式运行。
若要在图形界面中使用SGI STL?可在VC中调整Project-->Setting(Alt+F7), 设置编译选项?注意使用/MT和/GX?并且引入选项/Ic:\stl4vc\stlport及/libpath:c:\stl4vc\lib。
整个过程在笔者的老式Pentium 150机器上运行了超过3小时?读者的机器想必快得多?但也必然会花去出乎你意料的时间。全部完成后?C:\STL4VC这个目录的体积也由原来的区区4.4M膨胀到可怕的333M?当然这其中有300M是编译过程中产生的.obj文件?如果你确信自己的STLport工作正常的话?可以删掉它们?省出硬盘空间。不过这样一来?下次若再编译?就只好再等很长时间。
另外?据笔者勘察?STLport 4.0所使用的SGI STL并非最新问世的SGI STL3.3版本?不知道把SGI STL3.3的代码导入STLport会有何效果?有兴趣的读者不妨一试。
大致情形就是这样?现在?套用STLport自带文件的结束语?
Have fun!
孟岩
2001-3-11
【作者: shellhy_cn】【访问统计:316】【2006年02月27日 星期一 16:04】【 加入博采】【打印】
Trackback
你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=4552832