最近在想向Boost转移,努力掌握Boost代码的过程中,
STLport版本:5.2.1
Boost版本:1.4.6.1 (1.4.7.0也OK)
编译器Visual Studio 2010
STLPort的编译,选择Microsoft Visual Studio 20010下面的Visual Studio Tools下面的命令行环境编译工具,Visual Studio Command Prompt(2010)。
进入STLport目录,运行
1 2 3 4 |
|
但编译会出现错误,
1 2 3 |
|
估计是STLport还没有支持2010的问题导致的,检查了以代码,和google了一下问题,将_cstdlib.h(158)代码修正为,
1 2 3 |
|
注意_STLP_MSVC 和 _MSC_VER 是一个东东,就是VC的版本号,
STLPort编译很快就完成了,现在的机器搞定这个库已经是小意思了。默认应该有2个STLport版本,使用动态运行史库的动态库版本,使用静态运行时库的静态库版本。同时文件名称包含stld的版本是调试模式版本,在你使用宏_STLP_DEBUG生效。
STLport会自动进行链接,而且是根据你工程选择的是使用动态runtime library还是静态runtime library进行控制,决定让你使用静态库还是动态库,而你如果希望你的工程使用动态runtime library,同时链接STLport的静态库就必须用到交叉编译的库,编译使用在host.h文件中_STLP_USE_STATIC_LIB的宏,同时在配置时使用参数configure.bat msvc9 --with-dynamic-rtl。详细见下表。
版本说明 |
生成的文件 |
编译说明 |
使用说明 |
使用动态运行史库的动态库版本 |
stlport.5.2.dll stlport.5.2.lib stlportd.5.2.dll stlportd.5.2.lib stlportstld.5.2.dll stlportstld.5.2.lib |
默认会生成 |
stlportstld.5.2.lib是调试模式版本,使用宏_STLP_DEBUG控制 |
使用静态运行时库的静态库版本 |
stlport_static.lib stlportd_static.lib stlportstld_static.lib |
默认会生成 |
stlportstld_static.lib是调试版本,使用宏_STLP_DEBUG控制 |
使用静态运行时库的动态库版本 |
stlportstld_x.5.2.lib stlportstld_x.5.2.dll stlportd_x.5.2.lib stlportd_x.5.2.dll stlport_x.5.2.lib stlport_x.5.2.dll |
配置时要 configure.bat msvc9 --with-static-rtl |
要修改 stlport/stl/config/host.h 增加#define _STLP_USE_DYNAMIC_LIB 调试版本需要宏_STLP_DEBUG |
使用动态运行时库的静态库版本 |
stlportstld_statix.lib stlportd_statix.lib stlport_statix.lib |
配置时要 configure.bat msvc9 --with-dynamic-rtl |
要修改 stlport/stl/config/host.h 增加#define _STLP_USE_STATIC_LIB 调试版本需要宏_STLP_DEBUG |
注意如果你需要动态运行时库的静态库版本(真绕口),先编译普通版本configure.bat msvc9,在nmake clean install 编译,然后在改变host.h文件,再增加#define _STLP_USE_DYNAMIC_LIB(打开注释),然后再configure.bat msvc9 --with-dynamic-rtl,再编译。为啥要这样?因为STLport的编译脚本非要拷贝先拷贝动态库版本……,这个错误让我在编译VS2012的版本的时候折腾了1天。特此说明纪念。
如果你希望在你的代码里面优先使用STLport的代码,而不是微软的默认STL实现,你要调整一下设置,VC2010的目录设置发生了很大的调整。以前的版本设置路径都在菜单tools\options下VC++ Directory下面进行调整,方便快捷,VS2010做了一个很让人不爽的改动设计,你必须先打开一个工程,打开菜单view\property Manager,选择工程,选工程下DEBUG|WIN32和RELEASE|WIN32下面的Microsoft.Cpp.Win32.user,注意这两层菜单都可以打开选项界面,但是一个是工程的,一个是全局的(一定要选择Microsoft.Cpp.Win32.user这层),我经常搞混,然后一头雾水。
然后再进行目录调整,注意要去掉继承选项,然后将STLPort的目录要放到所有目录前面,让回将默认的一条条输入到其后面去(对于继承来的无法调整目录的先后顺序),比原来麻烦不少。据说这个改动是为了VS2010测试版时有人希望对不同的用户提供不同的Libaray管理,我靠他先人板板,程序员有几个人和他人共用PC的,而且还要编程目录不一致。
BOOST的编译就更加痛苦一些了。首先我的4核机器上要编译几个小时才能编译完成。大家要有点耐心。
当然如果你的要求不高,你可以选择一个简单的方法,获取BOOST已经编译好的库,liangfeng推荐了一个网站给我,www.boostpro.com 。上面会提供各种版本VS版本,各个版本号的BOOST库供你下载,而且都是全自动化的,非常方便。如下图:
可以看出,BOOSTPro提供了VC2003,VC2005,VC2008,VC2010的,多线程动态runtime library动态库版本,多线程动态runtime library静态库版本,多线程静态runtime library静态库版本(每个都10多M),单线程静态runtime library静态库版本。注意你要是全部下载的化,有好几个G的文件,下载的过程也要有点耐心。
当然全自动化的结果是由代价的,一是下载给你的库没有提供pdb文件,如果你想调试boost库的代码,发现问题,这招就不要用了。二是,他提供的下载源代码文件里面只有头文件,三是,如果你想用STLport+BOOST(STLport作为底层库,而不是使用微软的实现)的方式,BOOSTPro网站没有提供这种库给你下载。四是,目前他没有64位的版本。
我因为想用STLPort替代现有的库实现,我也要选择自己进行编译。
要说明的是BOOST库目前的版本已经很容易编译了,而且会自动识别那些库可以编译,那些不能编译了。仍然选择Visual Studio Command Prompt(2010) 进入boost的根目录,
cd E:\HaveFun\Boost\boost.1.46.1
bootstrap.bat
bjam.exe就生产了。
Boost的build说明文档如裹脚布一样,又臭又长,如果你没有耐心直接看bjam的帮助,
bjam —-help
但倒霉的是这里面又没有说明如果要用STLPort怎么帮,这个只有看帮助文档。如果要用STLPort作为底层编译BOOST,详细见BOOST的说明,Chapter 33. Boost.Build V2 User Manual 中的Reference
1 2 3 4 5 6 7 |
|
翻译过来就是如果你想希望默认使用STLPort的库,你要编辑project-config.jam 增加一行
using msvc ;
using stlport : 5.2.1 : E:/HaveFun/STLport/STLport.5.2.1/stlport : E:/HaveFun/STLport/STLport.5.2.1/lib ;
#注意路径用/,或者\\
说明一下编译参数和属性,
threading=single,multi 当然单线程版本你用的干嘛,不编译还可以节约一般的时间。
link=shared,static 生成的库是静态还是动态
runtime-link= shared,static,运行时库使用动态还是静态的。
stdlib=stlport 使用STLport
--build-type=commplete,minimal commplete标识所有的版本都编译,minimal只编译多线程的静态库版本。
--stagedir=./stage 指本地构建的存放库的目录,
--show-libraries 显示所有需要编译的库,其实不多,天知道为什么要了那么大的空间。
--with-<lib> 单独编译你想编译的库
--without-<lib> 编译所有的库,除了你制定不编译的以外。
然后就可以开始编译了,注意路径名称
1 |
|
全部编译:bjam --toolset=msvc-10.0 threading=multi link=shared,static --build-type=complete --statedir=./stage
然后就是漫长的等待……,等待……等待……如果全部编译,你至少可以用这个时间看完一部电影……
1.46版本生成的静态库在stage\lib下,动态库和相应的链接库在bin.v2下面。bin.v2下面,目录一层又一层,建议你全部搜索了拷贝出来,放在一个目录下(我一般喜欢把所有的库放到一个目录下面)。1.47版本好像全部放到stage目录下了,省事不少。
Boost是根据每个库生成对应的.lib文件的,实在不明白为什么不合并成一个库文件。
另外,BOOST也采用了帮助你自动链接的技术,可以省却你一些麻烦。BOOST库的命名比STLPort还要更加眼花缭乱,后缀含义简直是乱花渐欲迷人眼。比如libboost_serialization-vc100-mt-sgdp-1_49.lib。
前面是库名称,vc100表示编译器,最后面是版本号。下面来解释一下中间那些字符的含义:
版本号中标记的含义 |
表示的含义 |
lib前缀 |
静态库版本(动态库版本没有lib的前缀) |
vc100 |
编译器版本好,vc100标识vc10.0 |
s |
运行时库试用静态库版本(运行时库试用动态库版本没有特殊标记) |
gd |
debug调试版本(Release版本没有特殊标记) |
p |
使用STLport作为STL实现的版本, |
mt |
多线程版本,(单线程版没有特殊标记) |
注意BOOST DEBUG版本使用的是带调试模式的STLPort,编译你的代码必须定义_STLP_DEBUG=1,这时候编译器回去链接调试模式的STLport版本。
最近打算认真学习一下Boost库,准备在日常工作中,用Boost替换自己常用的ACE库作为跨平台实现。大家耐心等待后续的文章。
【本文作者是fullsail(雁渡寒潭),本着自由的精神,你可以在无盈利的情况完整转载此文档,转载时请附上BLOG链接:http://www.cnblogs.com/fullsail,否则每字一元不讲价。对Baidu文库加价一倍】