VC++2010下编译STLport,Boost
VC++2010下编译STLport,Boost
最近在想向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
|
cd E:\HaveFun\STLport\STLport.5.2.1 configure.bat msvc9 cd build/lib nmake clean install |
但编译会出现错误,
1
2
3
|
E:\HaveFun\STLport\STLport.5.2.1\stlport\stl/_cstdlib.h(158) : error C2084: function '__int64 abs(__int64)' already has a body C:\Program Files\Microsoft Visual Studio 10.0\VC\INCLUDE\../include/stdlib.h(471) : see previous definition of 'abs' NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 10.0\VC\BIN\cl.EXE"' : return code '0x2' |
估计是STLport还没有支持2010的问题导致的,检查了以代码,和google了一下问题,将_cstdlib.h(158)代码修正为,
1
2
3
|
#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的版本号,
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 library The STLport library is an alternative implementation of C++ runtime library. Boost.Build supports using that library on Windows platfrom. Linux is hampered by different naming of libraries in each STLport version and is not officially supported. Before using STLport, you need to configure it in user-config.jam using the following syntax: using stlport : [version] : header-path : [library-path] ; Where version is the version of STLport, for example 5.1.4, headers is the location where STLport headers can be found, and libraries is the location where STLport libraries can be found. The version should always be provided, and the library path should be provided if you 're using STLport' s implementation of iostreams. Note that STLport 5.* always uses its own iostream implementation, so the library path is required. When STLport is configured, you can build with STLport by requesting stdlib=stlport on the command line. |
翻译过来就是如果你想希望默认使用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 threading= multi link=shared, static stdlib=stlport --stagedir=./stage |
全部编译: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文库加价一倍】
VC++2010下编译STLport,Boost的更多相关文章
- Boost学习总结(一)VS2010环境下编译STLport和Boost
Boost学习总结(一)VS2010环境下编译STLport和Boost Boost简介 Boost库是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库.1998年,Beman G.Da ...
- linux下编译安装boost库
linux下编译安装boost库 linux下编译安装boost库 1.下载并解压boost 1.58 源代码 下载 解压 2.运行bootstrap.sh 3.使用b2进行构建 构建成功的提示 4. ...
- Linux下编译使用boost库:
Boost是什么不多说, 下面说说怎样在Linux下编译使用Boost的所有模块. 1. 先去Boost官网下载最新的Boost版本, 我下载的是boost_1_56_0版本, 解压. 2. 进入解压 ...
- windows下编译安装BOOST
boost的编译和使用,经过搜集资料和总结,记录成文.感谢文后所列参考资料的作者. 1 下载 地址:http://sourceforge.net/projects/boost/files/boost/ ...
- RedHat下编译安装Boost
1.解压boost_1_54_0.tar.gz 2.进入目录后,运行 ./bootstrap.sh ,会生成一个 bjam 的可执行程序 3.运行 ./bjam release install 进行编 ...
- VC 2010下安装OpenCV2.4.4
说明: 安装平台:32位XP,VS2010: OpenCV 2.4.4不支持VC 6.0: 网上有很多用CMake编译OpenCV的安装教程,这里建议先不要自己编译,如果使用预编译好的库有问题,再尝试 ...
- 转载 VC 2010下安装OpenCV2.4.4
说明: 1.安装平台:32位XP,VS2010: 2.OpenCV 2.4.4不支持VC 6.0: 3.网上有很多用CMake编译OpenCV的安装教程,这里建议先不要自己编译,如果使用预编译好的库有 ...
- VC环境下编译OpenSSL(仅仅是个示例,网上还有许多相关文章)
VC环境OpenSSL安装以及编程过程 SSL就是Secure Sockets Layer,是一种安全套接字协议,详情请参考链接中的介绍. 配置过程中需要生成一些mak文件,这些生成代码用perl脚本 ...
- Linux下编译安装BOOST
linux平台下要编译安装除gcc和gcc-c++之外,还需要两个开发库:bzip2-devel 和python-devel,因此在安装前应该先保证这两个库已经安装: #yum install gcc ...
随机推荐
- POJ 2318 TOYS(计算几何)
题目大意:有一个矩形盒子,盒子里会有一些木块线段,并且这些线段是按照顺序给出的,有n条线段,把盒子分层了n+1个区域,然后有m个玩具,这m个玩具的坐标是已知的,问最后每个区域有多少个玩具 解题思路:因 ...
- c++学习-链表
静态链表: #include<iostream> #include<string> using namespace std; struct book{ int num; flo ...
- API 双方认证探讨
开放 api 已是大势所趋.而 api 这种东西有个特点就是覆水难收.一旦公开出去了,被大量用户使用,一旦修改,就会让广大用户都掉坑里.所以,api 在设计之初就要尽量考虑周全,并预留扩展可能. 目前 ...
- Linux tar指令
linux 下的命令真是太多了.最近在看<Linux Shell编程从初学到精通>一书.该书有468页,很可惜我并不是那种很有耐性一个例子一个例子地跟着做的人,最多在看到些不太清楚的地方会 ...
- JavaScript笔记之数组 keyword(存储和释放&堆栈 & 按值 引用)
1.数组创建及初始化 var obj=new Array(); var arr=[]; 可以延伸为长度一定的,字面量定义数组 2.堆栈 按值传递 引用类型 数组是引用类型,不是值传递, 栈:系桶自动分 ...
- 转: Ubuntu 安装字体方法
命令安装: 以微软雅黑字体为例(其他的宋体.黑体等点阵字体都一样的),我们的雅黑字体文件是:Yahei.ttf(放在自己的主目录下)(在widows目录的Fonts目录下找需要的字体)由于我是双系 ...
- rails4.2.6配置发送邮件
调试了很久,最后终于可以发送了 1 在config/environments/development.rb文件里配置邮件信息 config.action_mailer.raise_delivery_e ...
- git查看历史命令
1 git show git show 分支名/HEAD/hash值 2 git log参数 --oneline 单行信息--decorate 输出commit引用信息--graph 图形化输出--a ...
- C++学习43 输入输出有关的类和对象
输入和输出是数据传送的过程,数据如流水一样从一处流向另一处.C++形象地将此过程称为流(Stream).C++的输入输出流是指由若干字节组成的宇节序列,这些宇节中的数据按顺序从一个对象传送到另一对象. ...
- Oracle中增加,修改,删除表中的列
有些时候,当一个表已经建好,并且已经使用后,发现需要对表结构进行修改,这个时候就要对表中的列进行增删查改操作. 为表增加新列: ALTER TABLE table_name ADD ( column_ ...