boost安装总结

 
1下载
 官方网站: www.boost.org  按照连接到sourceforge指定地方下载boost_1_34_0.zip
2安装
 我目前只是在window机器上使用了一下。
解压后,
 需要设置两个地方。
第一,     执行boost_1_34_0/tools/jam/src 下的build.bat,会生成/bin.ntx86/bjam.exe,将bjam.exe拷贝到你的boost库的根目录下,在命令行下执行之。过程有点长,plz wait!  另外,因为它默认对多种编译器都同时进行了配置,所以如果你没有装一些编译器的话,会看到屏幕上会打印出很多系统找不到指定目录的信息,没关系。
第二,     第二,设置编译器查找库文件路径的地方,比如VC6中, tools->option->directory, 加入你的boost库根路径就可以了
 3 试用
from: dozb的程序人生,稍加修改
字符串→数值

#include <boost/lexical_cast.hpp>
#include <iostream>
using namespace boost;
using namespace std;
int main()
{
        int a = lexical_cast<int>("123");
        double b = lexical_cast<double>("123.12");
         cout<<a<<endl;
         cout<<b<<endl;
        return 0;
}
数值→字符串
#include <boost/lexical_cast.hpp>
#include <string>
#include <iostream>
int main()
{
using std::string;
const double d = 123.12;
string s = boost::lexical_cast<string>(d);
std::cout<<s<<std::endl;
return 0;
}

异常
如果转换失败,则会有异常bad_lexical_cast抛出。该异常类是标准异常类bad_cast的子类。

#include <boost/lexical_cast.hpp>
#include <iostream>
int main()
{
using std::cout;
using std::endl;
int i;
try{
i = boost::lexical_cast<int>("abcd");
}
catch(boost::bad_lexical_cast& e)
{
cout<<e.what()<<endl;
return 1;
}
cout<<i<<endl;
return 0;
}
显然“abcd”并不能转换为一个int类型的数值,于是抛出异常,捕捉后输出“bad lexical cast: source type value could not be interpreted as target”这样的信息。

注意事项
lexical_cast依赖于字符流std::stringstream(会自动引入头文件<sstream>[4]),其原理相当简单:把源类型读入到字符流中,再写到目标类型中,就大功告成。例如

int d = boost::lexical_cast<int>("123");
就相当于
int d;
std::stringstream s;
s<<"123";
s>>d;
既然是使用了字符流,当然就有些随之而来的问题,需要特别指出[5]。
由于Visual C++ 6的本地化(locale)部分实现有问题,因此如果使用了非默认的locale,可能会莫名其妙地抛出异常。当然,一般情况下我们并不需要去改变默认的locale,所以问题不是很大。

输入数据必须“完整”地转换,否则抛出bad_lexical_cast异常。例如

int i = boost::lexical_cast<int>("123.123"); // this will throw

便会抛出异常。因为“123.123”只能“部分”地转换为123,不能“完整”地转换为123.123。

浮点数的精度问题。


std::string s = boost::lexical_cast<std::string>(123.1234567);

以上语句预想的结果是得到“123.1234567”,但是实际上我们只会得到“123.123”,因为默认情况下std::stringstream的精度是6(这是C语言程序库中的“前辈”printf留下的传统)。这可以说是boost::lexical_cast的一个bug。怎么办呢?权宜之计,可以这么做:打开头文件<boost/lexical_cast.hpp>,注意对照修改[6]:
#include <boost/limits.hpp>
//...
template<typename Target, typename Source>
Target lexical_cast(Source arg) {
//...
Target result;
interpreter.precision(std::numeric_limits<Source>::digits10);
if( !(interpreter << arg) ||
!(interpreter >> result) ||
!(interpreter >> std::ws).eof())
//...
}
即可得到正确结果
4 说明
做到以上几步,恭喜您,大部分Boost库就可以用了。

为什么不是全部?首先,目前还没有一个能完全符合C++标准的编译器,所以Boost库中的组件或多或少不可用,详细信息请看Boost网站上“编译器支持情况(Compiler Status)”一文。另外,有些库需要Build相应的lib或dll文件。不过这样的库很少,主要是由于平台相关性的原因, 如处理正则表达式的 regex 、支持python语言的python库等,而建构库的过程相当烦琐,需要使用Jam工具(可以简单提一下:在tools/build/jam_src/builds目录下有三个文件win32-borlandc.mk、win32-gcc.mk、win32-visualc.mk,分别是适用于Windows平台下的Borland C++ Compiler、GNU C++和Visual C++的mak文件。如果在Unix平台,则应使用tools/build/Makefile。用命令行工具make或nmake来做出Jam执行文件,然后再用Jam来建构库,详细内容可见Boost.Build文档)。我个人的建议是,不用急着去建构lib或dll。真的需要使用这些库时,再make随库提供的mak文件即可。虽然Boost.Jam也许是Boost库未来发展的方向,不过毕竟绝大部分库都无须建构,可以直接使用。
 5. regex库的安装,试用
先做一点试试,我的平台还是windows XP+ VC6.0
step1:   找到文件vcvars32.bat ,备用
step2:  打开一个cmd窗口,并把路径切换到我的boost库目录下的 /libs/regex/build 子目录,找到vc6.mak文件
step3: 运行 'nmake -fvc6.mak ' ,错误提示: Error MSVCDIR 变量没有指定! 解决办法:在vcvars32.bat中找到
类似"set MSVCDir=C:/PROGRA~1/MICROS~2/VC98" 的一行,拷贝等号后面的路径。用UE打开vc6.mak文件
在前面点的位置 定义怎么一行"MSVCDIR = C:/PROGRA~1/MICROS~2/VC98"。 把这个新的mak文件另存为vc6_new.mak
step 4: 运行 'nmake -fvc6_new.mak ' ,  然后便会产生所需的库文件等
step5:  运行 'nmake -fvc6_new.mak  install' ,就会自动将regex库文件拷贝到 MSVCDIR 指定的目录下的相关目录下(如/bin,/libs等)
这样就 基本搞定了。关于什么regex++,我还没有试过。
VS2005 下编译 boost
1. 启动 VS2005 ,在 Tool 菜单中选择 “Visual Studio 2005 Command Prompt“ VS 会启动命令提示符窗口,并自动设置好相应的环境变量。
 
2. 转到 <boost>/libs/regex/build 目录下( <boost> 是你存放 boost 代码的路径),运行以下命令即可进行编译,这个过程可能会比较久:
nmake -f vc8.make
 
3. 运行以下命令进行安装, boost 会把上一步产生的 lib 文件等拷贝到你的 VC 目录下。
nmake -f vc8.make install
 
4. 最后清除安装时产生的临时文件:
nmake -f vc8.make clean
 
OK,大功告成!可以享用正则表达式带来的强大威力了!
试用
现在找到regex程序小试一下:
实现一个简单的split功能
#include <list>
#include <iostream>
#include <boost/regex.hpp>
using namespace std;
unsigned tokenise(std::list<std::string>& l, std::string& s)
{
   return boost::regex_split(std::back_inserter(l), s);
}
int main()
{
   string s = "i am a boy!";
   list<string> l;
   unsigned result = tokenise(l, s);
   cout << result << " tokens found" << endl;
  
   while(l.size())
   {
   s = *(l.begin());
   l.pop_front();
    cout << s << endl;
   }
  
   return 0;
}
运行成功!
 
 
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值