中影时代电影城唐延路:boost安装总结

来源:百度文库 编辑:偶看新闻 时间:2024/05/05 19:43:13

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

#include

using namespace boost;

using namespace std;

int main()

{

        int a = lexical_cast("123");

        double b = lexical_cast("123.12");

         cout<

         cout<

        return 0;

}

数值→字符串

#include

#include

#include

int main()

{

using std::string;

const double d = 123.12;

string s = boost::lexical_cast(d);

std::cout<

return 0;

}

异常

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

#include

#include

int main()

{

using std::cout;

using std::endl;

int i;

try{

i = boost::lexical_cast("abcd");

}

catch(boost::bad_lexical_cast& e)

{

cout<

return 1;

}

cout<

return 0;

}

显然“abcd”并不能转换为一个int类型的数值,于是抛出异常,捕捉后输出“bad lexical cast: source type value could not be interpreted as target”这样的信息。

注意事项

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

int d = boost::lexical_cast("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("123.123"); // this will throw

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

浮点数的精度问题。

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

以上语句预想的结果是得到“123.1234567”,但是实际上我们只会得到“123.123”,因为默认情况下std::stringstream的精度是6(这是C语言程序库中的“前辈”printf留下的传统)。这可以说是boost::lexical_cast的一个bug。怎么办呢?权宜之计,可以这么做:打开头文件,注意对照修改[6]:

#include

//...

template

Target lexical_cast(Source arg) {

//...

Target result;

interpreter.precision(std::numeric_limits::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. 转到\libs\regex\build目录下(是你存放boost代码的路径),运行以下命令即可进行编译,这个过程可能会比较久:

nmake -f vc8.make

 

3. 运行以下命令进行安装,boost会把上一步产生的lib文件等拷贝到你的VC目录下。

nmake -f vc8.make install

 

4. 最后清除安装时产生的临时文件:

nmake -f vc8.make clean

 

OK,大功告成!可以享用正则表达式带来的强大威力了!

试用

现在找到regex程序小试一下:

实现一个简单的split功能

#include

#include

#include

using namespace std;

unsigned tokenise(std::list& l, std::string& s)

{

   return boost::regex_split(std::back_inserter(l), s);

}

int main()

{

   string s = "i am a boy!";

   list 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;

}

运行成功!