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:dukejoe@163.com联系我。或者继续关注我的Blog: http://dukejoe.yeah.net 的其它后续文章。谢谢。转载请注明出处为http://dukejoe.yeah.net,并保留作者姓名和本句话,谢谢合作