体验:VC++ .NET 2003 –安装和使用STLport 4.5.3 和LokiPort

发表于:2007-07-01来源:作者:点击数: 标签:
体验:VC++ .NET 2003 –安装和使用STLport 4.5.3 和LokiPort 小气的神 2003-05-01 Article Type: In-Depth 难度等级:7/9 版本:1.52 “I want Visual C++ to be the C++ implementation of choice” - Stanley Lippman 最近,也就是两天前Windows Server 2

 体验:VC++ .NET 2003 –安装和使用STLport 4.5.3 和LokiPort 


 

小气的神

2003-05-01

 

Article Type: In-Depth 

难度等级:7/9       

版本:1.52

 

 “I want Visual C++ to be the C++ implementation of choice”      -Stanley Lippman

 

最近,也就是两天前Windows Server 2003发布,伴随着也发布了微软最新的开发工具Visual Studio.NET 2003,(其中的一些新特性之前在我的《》中已经都说明了,这里就不浪费篇幅了)你会发现整个Visual Studio.NET 2003中的Visual C++.NET的改善或是说新特性特别的突出,被认为宣传上最重要的四大亮点:

1.        Enhanced ISO C++ Conformance

2.        New Pentium IV, Athlon Optimizations

3.        Improved Code Security

4.        New Windows Forms

 

除了提供性能安全性的加强之外,对于1,4则是让我感兴趣的,针对ISO C++ Standard和Visual C++.NET的问题,目前微软出示的数据显示其兼容和符合标准的程度达到了98%

“The ISO C++ language standard defines several advanced features that have been conspicuously absent from previous versions of Visual C++.  Visual C++ .NET 2003 now implements roughly 98% of the standard-defined language features, a statistic that is on par with or better than the majority of commercial C++ compilers, on any platform.  In comparison, Visual C++ 6.0 implements roughly 81% of the ISO C++ standard; Visual C++ .NET 2002 implements 87% of the ISO C++ standard.”

 

确切的消息指出最早这个数据出自三个Test Suite中的Perennial,另外两家分别是Plumb Hall 和Dinkumware。并且Microsoft Visual C++.NET的产品经理Nick Hodapp也拿出具体的清单得出98%出自C++ ISO Standard的这些部分(更具体的信息见):

l          2.2 Unicode identifiers 

l          3.4.2 Full Koenig lookup 

l          8.5.1 Empty aggregate initialization 

l          9.8 Symbol lookup for local member functions 

l          11.4 Friends in class templates (also 14.5.3) 

l          13.3.1.1.2 Implicit invocation of ptr-to-func conversions 

l          13.3.3.2 Ranking of derived to base conversions 

l          14 Export keyword

l          14.1 Non-type template parameters (also 14.3.2)

l          14.5.2 User-defined conversion templates

l          14.5.4 Partial specialization of class templates

l          14.5.5.2 Partial ordering of function templates

l          14.6 Dependent name lookup

l          14.7.1 Nested classes in class templates

l          14.7.3 Explicit specialization of member templates

l          15.4 Exception specifications

l          15.5.2 The unexpected() function

 

We´re not at 100%, yet, but expect that we´ll remain on the path towards full conformance.  In particular, the ISO features "Export" and "Exception Specifications" are tricky, and there is much debate as to their usefulness.

 

对于14.6 微软承诺在下一个版本会实现.让C++社团非常感兴趣的信息可能是”Compile and use popular C++ community-written libraries including LOKI, BLITZ, and BOOST”冲着这句话和98%的高度兼容指标,抱着测试和验证的想法,我编译和测试了一些”C++ community-written libraries”。其一,验证一下是否真是如其言;其二,我也发现网络上抱有类似想法的人还不少,而进行的过程各不相同,所以是一种不错的体验或经历;其三,我发现这方面的中文资料太少,所以整理一份记录和相关资源与大家分享吧。于是也就有了这两篇文章,第一篇是关于STLport 4.5.3和Loki,第二篇是关于Boost 1.30和Blitz++ Library的体验.

 

    首先是Loki Library,这个类库就不用介绍太多,刚好最近Andrei Alexandrescu的《Modern C++ Design》一书中文版――C++设计新思维出版,有更多人会对它有更多更深的了解。对于这套类库其实不存在实现编译和安装的问题,一般是将需要的模块或功能通过Include到你的项目中,然后进行调用-编译-运行。总来说,Alexandrescu不是基于Visual C++来编写这个类库的,所以如果你真的直接用Visual C++ .NET来编译的话,可能也够你受的,我偷了懒,在网上我就找到了这方面的资源。并且Visual Studio.NET 2002我测试通过过,所以2003的版本我测过也没问题,剩下来就是资源的问题,找到合适的资源我想你就可以在办好你需要做的事情J

Original download:

VC6 +SP5 download:

VC7.0 + download:

当然你也可以到我的网站上获得

下载LokiPort_VC7.zip,将其解压到一个目录比如Visual Studio.NET 2003的安装目录下,然后就可以测试一下了,非常好的是这里面已经提供了每个模式的测试程序,你只用到tests目录中进行编译-运行就可以测试其编译器的情况了。

比如: cl /GX /MT /EHsc Test_XXXXX.cpp 然后运行-OK

 

 

当然有些比较特殊一点,我猜你会编译Test_SmartPtr.cpp第一次会出错,只要你按照Zip文档中的Readme上做就没有问题,换成下面的指令:

cl /GX /MT /GR /EHsc Test_SmartPtr.cpp ../SmallObj.cpp

 

用CL.exe你有两点需要注意:

1.     保证你运行了 X:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vsvars32.bat D:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\vsvars32.bat

2.      注意你的环境变量中INCLUDE有LokiPort的路径比如

@set INCLUDE=%MSVCDir%\LokiPort70;%MSVCDir%\ATLMFC\INCLUDE; …

C:> SET INCLUDE=C:\LokiPort70;%INCLUDE”

更简单的是使用Visual Studio.NET 安装程序组中的Visual Studio.NET 2003 Command Prompt

 

 

不过我建议你先备份你的vsvars32.bat然后直接修改这个文件,在加入Loki Library的Include的路径。

上述例子中我的Loki library在下面的路径:

D:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\LokiPort70\tests>

 

啊哈,太简单了吧,当然Loki这样是可以过关了,如果都这么简单,我也就不用写这篇文章了,后面还有更多有趣的故事,接下来该 STLport了。

 

有关STLPort是什么,又怎么样,如何如何我就不用再多说J,我们直接入正题,装好用好才是关键

我使用的是STLport 4.5.3 安装目录:C:\STLport-4.5.3

Visual C++安装在D:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin

 

你可以从这里进行Download

Visual C++ 6.0的你可以在这篇文章中找到大部分资源和步骤,但对于在VC6中最新的4.5.3要编译通过还需要一个补丁见下面的”Bug fix for VC 6”:

Using STLport with Microsoft Visual C++ 6

http://www.softadvances.com/articles/stlportusing.html

作者一个好的忠告J “Dinkumware´s VC6 STL is $90; the others are free. While SGI´s library works with VC6, it has problems with <iostream>. I haven´t tried Dinkumware or Boost.” 不过这个建议对于Visual Studio.NET的用户来说似乎并不适用.

 

我则用了上面文章类似的步骤测试:

Download下来STLport-4.5.3.zip(1.2M) 解压缩之后,第一反应是需要设置你的INCLUDE和PATH,在这两者中指明你的STLport Library的路径(见上面)。

 

众所周知,Visual Studio.NET中带的STL库是P.J. Plauger写的一套STL类库(也是C++ STL一书的作者也是上面我们提到的Dinkumware公司的创始人之一),对于STLPort主要是强调多平台和多编译器,所以Visual C++.NET不是原生的就可以编译和支持,这个问题在Visual Studio.NET 2002(VC7.0)中就发现了,但就我看到的VC7.1中问题似乎更加严重了。

 

STLPort-4.5.3\src 中有你可以看到令你振奋的vc7.mak如果你直接执行nmake –f vc7.mak install,你会非常非常的沮丧,因为不会直接编译通过的。

通过不断地测试和阅读大量的讨论组,我发现总结,需要进行下面的修改:

1.       stlport/config/stl_msvc.h

注释定义:#define _STLP_NO_TYPENAME_ON_RETURN_TYPE 1进行注释 //#define _STLP_NO_TYPENAME_ON_RETURN_TYPE 1

修改所有类似 _STLP_MSVC <= 1300_STLP_MSVC <= 1310

1310为VC7.1的版本号原来的文件都是针对VC++ 7.0的

2.    stlport/stl/_ios.h

移动代码块

# if defined (_STLP_USE_TEMPLATE_EXPORT)
_STLP_EXPORT_TEMPLATE_CLASS basic_ios<char, char_traits<char> >;
# if ! defined (_STLP_NO_WCHAR_T)
_STLP_EXPORT_TEMPLATE_CLASS basic_ios<wchar_t, char_traits<wchar_t> >;
# endif
# endif /* _STLP_USE_TEMPLATE_EXPORT */

到语句之后

# endif /* _STLP_NO_METHOD_SPECIALIZATION */

但保证在_STLP_END_NAMESPACE这句之前

3.    stlport/stl _deque.c , stlport/stl/_hashtable.c, stlport/stl/_string.c, stlport/stl/_tree.c

这部分修改比较多,基本上将这些文件中的

 __iterator__     -> typename __iterator__

 __sizet_type__   -> typename __size_type

 __reference__ -> typename __reference__

这部分挺多了,具体的你可以参考这个文档:stlport4.5.3-vs.net-2003.diff

      

       任何人对会对修改这些感到厌烦,我将其修改的相关文件都已收集到我的网站。你Download下来,先备份你的原始文件,然后将覆盖相同的文件即可。

Downlaod: ,

4.      在做了之上的调整之后,你可以开始进行编译。键入:

nmake –f vc7.mak instll

copy vc7.mak Makefiel

namek vc7.mak clean all

5.      不多时编译就会完成,你会发现类型下面的编译结果

 

 

然后可以开始测试一下我们编译的结果,看看STLport是否能够正确的使用。

设置

SET INCLUDE=%MSVCDir%\ \STLport-4.5.3\stlport;%MSVCDir%\ATLMFC\INCLUDE;…

Copy 编译的lib , dll 到%MSVCDir%\LIB;

否则设置:

SET LIB=%MSVCDir%\ STLport-4.5.3\lib;%MSVCDir%\ATLMFC\LIB;….

我选择的是STLport带的测试程序

cd \test\eh

namek –f vc6.mak

结果如下图

 

 

不用太过于紧张,一看需要修改这么多J大部分的修改是调整一些声明和语法,不同平台和编译器之间的切换造成的,更重要的一点是STLPort并不原生支持VC编译器,讨论组中有人埋怨,希望下一版本的STLport 5.0对VC编译器支持能够的更好,我猜这改变不是立即就发生,不过VC++是我非常喜欢的一款编译器,6.0的时候如此,7.1的时候还是一样。

 

如果你在我的文章中没有编译通过或找到你想要的,那么这个论坛你要注意:

还有下面的几个帖子:

“STLPORT-5.0-0409 and VC7.0 (.NET2002)”

"Building on VC++ .NET 2003"

“Problems with VC7.1"

"STLPort does not compile with Koenig lookup"

"Bug fix for VC 6"

".NET 2003 "

"getting error in _string.h during compilation"

 

但愿这一部分我的描述足够清楚,也但愿这些文字对于你做同样的事情时会有帮助。整个Visual Studio.NET的家族中Visual C++.NET会变成一个相对非常特殊的产品和代表,成为唯一一个可以穿越Managed和Unmanaged环境的工具和介质,所以即使在.NET大行其道的未来,Visual C++.NET凭借着这一点,依然会光彩夺目,荣膺不坠。

 

对于是继续讲下去,还是放到下一篇文章再讲有些犹豫,先休息一下,给我一点时间,安排下面的Boost和Blitz++的内容和编排。

 


 

特别:

本文使用的Visual Studio.NET Version 7.1.2292, .NET Framework 1.1.4322是Visual Studio.NET Final Bate的版本还不是最终的版本,其结果不知是否和正式版本下有不同。

cl.exe- Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.2292 for 80x86

 

本文原创,CSDN署名首发,所有文字和图片版权所有。未经授权请勿传播、转载或改编。

如果有问题或建议,

欢迎访问我的WebLog:

 


原文转自:http://www.ltesting.net