Boost 安装指南[转]

作者:高宏伟(DukeJoe)
地点:黑龙江省哈尔滨市平房区
Blog:http://dukejoe.yeah.net
QQ:21807822

  随着技术的进步,人们对软件项目的要求日益提高。Boost库作为一个优秀的C++类库,通过几年的发展已经得到了广大技术人员的认可。本文将帮助刚刚接触Boost的用户来安装并配置Boost,并通过几个HelloWorld小程序,来验证安装的正确性。并且我也希望能通过这几个小程序使读者能对Boost有一个初步的认识,并尽快加入Boost的用户行列。在写本文的时候,我所使用的环境是Windows XP Home Edition + Boost1.33.1 + Visual Studio .NET 2003

  首先是从Boost的主页上下载相关的Boost的压缩包,我下载的是boost_1_33_1.zip,假定我们解压到D盘根目录。解压后的目录结构应该类似
boost_1_33_1<目录>
  -- boost <目录>
  -- doc <目录>
  -- libs <目录>
  -- more <目录>
等等这些目录和文件。

  打开Visual Studio .NET 2003 选择菜单 工具-->选项-->项目-->VC++目录,在“包含文件目录”里,增加一行,如:D:\boost_1_33_1。这样你就可以使用大多数的Boost类库。现在我们来写一个小程序,感受一下Boost

#include <vector>
#include <iostream>
#include <boost/lexical_cast.hpp>

using namespace boost ;
using namespace std ;

int main(int argc, char * argv[])
{
  vector<int> v1;
  vector<int>::const_iterator ci_v1 ;
  int iLength = 0 ;

  while( iLength < 10 )
  {
    try
    {
      if ( iLength == 5 )
        v1.push_back(lexical_cast<int>("DukeJoe")) ;
      else
        v1.push_back(lexical_cast<int>(iLength));
      }
      catch(bad_lexical_cast &ex)
      {
        cout << ex.what()<< endl ;
        v1.push_back(-1);
      }
      iLength++ ;
    }

    cout << "vector --> " ;
    for ( ci_v1 = v1.begin() ; ci_v1 != v1.end() ; ci_v1++ )
    {
      cout << *ci_v1 << " " ;
    }
    cout << endl ;

    return 0 ;
}

这个程序的功能是向vector里压入int,如果压入的不是int,而程序应该可以抛出异常,主程序通过捕获异常来确定程序的运行错误。程序本应该在vector里存入0到9的10个数,但我们强行在iLength等于5时,压入一个错误类型的值DukeJoe,这时程序应抛出异常,而catch捕获异常bad_lexical_cast,将-1压入vector,所以我们得到的这10个数中的第5个数,实际没有压入,而这个位置上我们看到的是在异常处理过程中压入的-1。lexical_cast的作用是进行简单的类型转换,如果转换不成功,则它会抛出一个异常bad_lexical_cast。关于lexical_cast的详细说明可以看一下Boost关于lexical_cast的文档。

  直接在VS2003里的包含目录加入boost的目录后,绝大多数的类库就可以使用了,但还有少数的类库需要额外再生成对应操作系统的动态库,才可以使用。我们以Windows+VS2003为环境,以regex类库举例说明。regex为我们提供了正则表达式功能,其中boost的regex支持perl语法,更极大的提升了我们使用正则表达式所产生的效果。但要想使用regex,我们需要生成相关的lib文件才可以。生成的步骤如下:开始 --> Microsoft Visual Studio.NET 2003 --> Visual Studio.NET 工具 --> Visual Studio.NET 2003 命令提示。使用这个命令提示符之后,VS就会为我们自动配置好VC环境。打开命令提示符之后,我们进入目录 D:\boost_1_33_1\libs\regex\build ,现在我们敲入 nmake /fvc71.mak 生成lib文件。生成lib文件之后,我们单独建一个文件夹,例如我建立的是d:\boost_libs,然后把所有的*.lib文件拷贝到这个目录。然后我们打开VS2003,选择菜单 工具-->选项-->项目-->VC++目录,在“库文件”里加入目录d:\boost_libs,这样VS2003在链接时,就会搜索这个目录

下面我们来看一个小程序,测试一下正则表达式功能

#include <iostream>
#include <string>
#include <iterator>
#include <boost/regex.hpp>

using namespace boost ;
using namespace std ;

int main(int argc, const char** argv)
{
  wchar_t * strSample = L"[哈尔滨]高宏伟 2007-05-15 呵呵 Blog:http://dukejoe.yeah.net " ;
  wregex rgExpression(L"(\\[(\\S*)\\])((\\S|\\s)*)(\\d{4,}-\\d{2,}-\\d{2,})((\\S|\\s)*)", boost::regex::perl) ;
  wcmatch what ;

  wcout.imbue(locale("chs"));
  try
  {
    if(regex_match(strSample, what, rgExpression))
    {
      wcout << L"match!" << endl ;
      for (unsigned int i = 0 ; i < what.size() - 1 ; i++ )
      {
        wcout << L"what[" << i << L"] --> " << what[i] << endl ;
      }
    }
    else
      wcout << L"not match!" << endl ;
  }
  catch(...)
  {
    return -1;
  }
    return 0;
}

这个程序我们使用的是宽字符,主要是因为我们要匹配汉字。程序中的strSample是一个样本,我们使用的正规表达式是rgExpression,构造函数的boost::regex::perl说明我们使用perl语法规则。正规表达式为我们先匹配[]中间的城市名称,然后还为我们匹配了一个带年月日的时间格式,所以在这个程序中对我们有用的是what[2]和what[5],分别匹配出用户的所在地(哈尔滨)和用户的时间(2007-05-15)。由于C语言的语法规定反斜杠为转义字符,所以在我们构造正规表达式时,我们要用两个反斜杠。regex_match用来进行实际的匹配工作。关于boost的正则表达式的用法,已经超出了本文的范围,本文将精力主要集中在使用这个程序验证boost安装过程上。以后有机会,我尽量在Blog上再写几篇专门介绍Boost Regex 正规表达式使用的文篇。如果大家编译上面的程序,在链接时没有报错,就是正确链接了lib库文件。通过程序的输出结果,说明程序运行正常,我们的库也就是安装正确了。

  下面我们使用Boost.Jam来Build所有的库。首先,我们再次打开VC.NET 2003的命令提示符,然后进入D:\boost_1_33_1\tools\build\jam_src目录,运行build.bat。这时我们会生成bjam的可执行程序。在本文中,Build过程会在jam_src下生成bin.ntx86这个子目录。现在我们来配置一下环境变量PATH,以便用bjam来build boost。配置步骤如下:右键我的电脑-->属性-->高级-->环境变量,在PATH这个变量后面加入bin.ntx86所在的绝对路径。例如我的PATH是:C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Bin\.;C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Bin\WinNT\.;D:\boost_1_33_1\tools\build\jam_src\bin.ntx86。注意:每个绝对路径要用分号隔开。同时要重新打开命令提示符,因为环境变量只在打开命令提示符的时候读取一次。另外,你还可以用set命令来设置环境变量,但这样的方法只对当前命令提示符有效。好!言归正传。现在我们设置了PATH。现在我们进入D:\boost_1_33_1目录,直接敲bjam,Build就会自动开始,并为我们生成Boost库。生成的库都放在bin子目录下,本文是D:\boost_1_33_1\bin。例如你可以在D:\boost_1_33_1\bin\boost\libs\regex\build里找到前面正则表达式例子所使用的lib库文件。前面我们说过我们自已新建了一个d:\boost_libs目录用于存放所有需要用到的库文件。因为刚才生成的文件都是分散在不同的子目录里,所以当你做开发时如果遇到需要lib文件时,你可以在把所需要的库文件拷贝到d:\boost_libs里,这样你只要统一设置一个库文件目录,就可以使用了。

  前面我们所做的工作都是把整个boost的安装过程给分解来了,其实下面的内容如果不做,你应该也可以正常的使用Boost了。现在我们要介绍的过程是标准的 Boost 建立和安装过程。这部分我们将使用上面所介绍过的一些知识来做一下标准Boost的Build和Install过程。因为上面的介绍的方法太麻烦了,我们不可能每次都用这样的方法来安装,我之所以还要用大幅来做介绍,主要是因为通过上面的这些步骤,你可以初步的对Build过程中要使用的工具和简单的Boost有一个感性的认识。这样的过程会帮助初学者更快的进入角色。Boost的安装过程其实很简单。你建立一个d:\boost目录,然后解压zip文件到d:\boost_1_33_1。首先用上文中介绍的方法Build bjam的可执行文件(参与上一段的步骤),然后进入d:\boost_1_33_1。 在命令行执行bjam --prefix=d:\boost install 执行后,会在d:\boost生成所需要的所有库和头文件。然后你用上面介绍的配置Visual Studio.NET 2003的方法配置include目录为 D:\boost\include\boost-1_33_1,lib目录为D:\boost\lib。这样就大功告成了。

  我们解释几个重要的bjam的参数,
命令行的install的意思是指要安装库文件和头文件。
--prefix的意思是说安装独立文件的路径。上面我们使用的是d:\boost。
--exec-prefix的意思是说安装依赖文件的路径。上面我们没有输入。默认是prefix提供的目录,所以在本例中,应该是d:\boost
--libdir的意思是指安装库文件的路径。我们上面也没有输入。默认是exec-prefix提供的目录加lib,因为本例中exec-prefix使用的是prefix的目录,所以libdir为d:\boost\lib
另外还有一些比较常用的参数如:
--includedir 这个参数是头文件所在的目录。默认是PREFIX\include。比如上例中,我们的PREFIX值是d:\boost,所以头文件就放在d:\boost\include
--with这个参数是指Build或Install单独的库,就好像文章前半部分我们介绍的方法,但前面我们是手工做的。如果是使用这个参数,则可以自动完成指定库的Build和Install。例如:bjam --prefix=d:\boost install --with-regex

  如果在安装过程中我们不能编译,说明我们在VC的包含目录里设置的目录不正确,检查一下,因为有可能在解压过程中,boost的根目录由d:\boost_1_33_1变成了d:\boost_1_33_1\boost_1_33_1,这时只要把根目录提前一级就可以了。

  如果regex库在链接时找不到lib文件,这说明在VC的库文件目录里没有设置所生成的文件libboost_regex-vc71-sgd-1_33_1.lib所在的目录,这样VC就找不到boost需要使用的lib文件。在本文中,我们是集中把生成的lib都拷贝到d:\boost_libs里,集中管理,当然你也可能直接把库文件目录指向默认目录D:\boost_1_33_1\libs\regex\build\vc71,这个地方只要成对的匹配就可以。

  至此我们已经完成了boost的安装,同时我们使用两个小程序来测试了boost的正确性。在配置了“包含文件”的路径后,我们就可以使用大多数的boost库了,对于一些特殊的类,我们才需要生成lib文件,如regex。Boost虽然很好,但毕竟不如STL,MFC等常见,建议在大家在使用Boost时,至少要熟悉VC的各种配置及使用。如果大家在安装过程中遇到了其它困难,可以发e-mail:[email protected]联系我。或者继续关注我的Blog: http://dukejoe.yeah.net 的其它后续文章。谢谢。转载请注明出处为http://dukejoe.yeah.net,并保留作者姓名和本句话,谢谢合作

你可能感兴趣的:(boost)