【Boost库初探】Boost.Regex库编译、使用(32位/64位)

本文的运行环境为Win7 + VS2010
首先是对于编译32位版本,可使用较简单的方法,使用vcvars32.bat和nmake,虽然存在vcvars64.bat,但由于nmake是32位的,只能对于32位有效,后面有对32位64位通用的方法,建议采用后种方法

一、32位版本regex库编译

1. 下载boost库开发包:
进入Boost官网下载最新版本Boost库的rar文件。

2. 解压缩开发包:
F:\boost_1_57_0

3. 进入Regex库所在目录:
F:\boost_1_57_0\libs\regex\build,并在此文件夹下的地址栏输入cmd,可以看到cmd命令行显示如下:


4. 设置VS2010编译工具工具使用环境:
将F:\VS2010\VC\bin\vcvars32.bat用鼠标拖到当前的cmd窗口中,回车执行后显示:Setting environment for using Microsoft Visual Studio 2010 x86 tools.


5. 编译构建Regex库:
可看到F:\boost_1_57_0\libs\regex\build\文件夹下有许多mak文件,依据VS版本选择执行构建命令:
nmake -f vc10.mak
编译构建过程需要几分钟。
最后生成文件如下,很多lib、dll、pdb文件:

可见自动生成文件的版本号错了。先不管,等用到时候报错缺哪个文件,再修改哪个文件的名字。


6. 设置VS2010目录环境:
  1. 【项目】->【属性】->【配置属性】->【VC++目录】->【包含目录】下添加“F:\boost_1_57_0”,其实所有hpp文件都在F:\boost_1_57_0\boost下,但是我写时候要用到F:\boost_1_57_0下的其它文件,包含目录设成F:\boost_1_57_0\boost导致我的部分文件找不到,所以这里只设为F:\boost_1_57_0,在程序中#include "boost/regex.hpp"
  2. 【项目】->【属性】->【配置属性】->【VC++目录】->【库目录】下添加“F:\boost_1_57_0\libs\regex\build\vc100”
其实库目录项要用到的可能只有其中一个lib文件,具体是哪一项,编译以后再看。

7. 编写测试程序:
#include <iostream>
#include <string>

#include "boost/regex.hpp"

int main()
{
    boost::regex reg("\\d{3}([a-zA-Z]+).(\\d{2}|N/A)\\s\\1");

    std::string correct = "123Hello N/A Hello";
    std::string incorrect = "123Hello 12 hello";

    if (boost::regex_match(correct, reg) == true)
    {
        std::cout << "correct is mached!" << std::endl;
    }
    if (boost::regex_match(incorrect, reg) == true)
    {
        std::cout << "incorrect is unmached!" << std::endl;
    }
    system("pause");
    return 0;
}


8. 运行结果:
产生错误:LINK : fatal error LNK1104: 无法打开文件“libboost_regex-vc80-mt-s-1_57.lib”
到这里知道要用的是libboost_regex-vc80-mt-s-1_57.lib文件,将libboost_regex-vc80-mt-s-1_53.lib改名,然后成功。
程序运行结果:
correct is mached!
请按任意键继续. . .

9. 注意事项:
以上只是针对独立编译构建Regex库,如果整个boost库都已经编译构建完成了,则完全无需这么做,切记!


二、32位、64位通用编译方法

1.  编译环境

如果要编译指定的库,首先打开命令行,转到$BOOST_ROOT目录并运行目录下的bootstrap.bat脚本,这个脚本为Boost.Build系统的运行准备环境。

1
bootstrap.bat

可以看到现在$BOOST_ROOT目录下增加有b2.exe和bjam.exe两个可执行文件。这两个文件是一样的,只是名字不同,它们可以调用Boost.Build系统来创建上面那些需要编译安装的库。

2. 编译

比如我们想单独编译安装regex库,运行下面的命令即可

1
bjam stage --with-regex link=static threading=multi runtime-link=static address-model=64

下面介绍相关参数的含义:
stage 仅创建和安装库文件(不创建头文件),可以用 –stagedir= 选项指定库的安装位置,默认安装在当前目录下的stage文件夹内。
–with- 创建和安装指定的库,如果使用了这个选项,则仅仅指定的库被创建,其它库不被创建。如果不指定这个选项,默认创建所有需要编译安装的库。
link=static指定生成静态regex库
threading=multi指定生成多线程库
runtime-link=static指定链接静态C和C++ 运行库

address-model=64指定编译成64位

具体参数详解:

stage/install:stage表示只生成库(dll和lib),install还会生成包含头文件的include目录。本人推荐使用stage,因为install生成的这个include目录实际就是boost安装包解压缩后的boost目录(E:\SDK\boost\boost,只比include目录多几个非hpp文件,都很小),所以可以直接使用,而且不同的IDE都可以使用同一套头文件,这样既节省编译时间,也节省硬盘空间。

 
toolset:指定编译器,可选的如borland、gcc、msvc(VC6)、msvc-9.0(VS2008)等。
 
without/with:选择不编译/编译哪些库。因为python、mpi等库我都用不着,所以排除之。还有wave、graph、math、regex、test、program_options、serialization、signals这几个库编出的静态lib都非常大,所以不需要的也可以without掉。这可以根据各人需要进行选择,默认是全部编译。但是需要注意,如果选择编译python的话,是需要python语言支持的,应该到python官方主页http://www.python.org/下载安装。查看boost包含库的命令是bjam --show-libraries
 
stagedir/prefix:stage时使用stagedir,install时使用prefix,表示编译生成文件的路径。推荐给不同的IDE指定不同的目录,如VS2008对应的是E:\SDK\boost\bin\vc9,VC6对应的是E:\SDK\boost\bin\vc6,否则都生成到一个目录下面,难以管理。如果使用了install参数,那么还将生成头文件目录,vc9对应的就是E:\SDK\boost\bin\vc9\include\boost-1_46\boost,vc6类似(光这路径都这样累赘,还是使用stage好)。
 
build-dir:编译生成的中间文件的路径。这个本人这里没用到,默认就在根目录(E:\SDK\boost)下,目录名为bin.v2,等编译完成后可将这个目录全部删除(没用了),所以不需要去设置。
 
link:生成动态链接库/静态链接库。生成动态链接库需使用shared方式,生成静态链接库需使用static方式。一般boost库可能都是以static方式编译,因为最终发布程序带着boost的dll感觉会比较累赘。
 
runtime-link:动态/静态链接C/C++运行时库。同样有shared和static两种方式,这样runtime-link和link一共可以产生4种组合方式,各人可以根据自己的需要选择编译。一般link只选static的话,只需要编译2种组合即可,即link=static runtime-link=shared和link=static runtime-link=static,本人一般就编这两种组合。
 
threading:单/多线程编译。一般都写多线程程序,当然要指定multi方式了;如果需要编写单线程程序,那么还需要编译单线程库,可以使用single方式。
 
debug/release:编译debug/release版本。一般都是程序的debug版本对应库的debug版本,所以两个都编译。


3. 参考资料
http://grow.sinaapp.com/?p=1155





展开阅读全文

没有更多推荐了,返回首页