boost——入门指南

什么是boost

boost库是一个开源免费的第三方库,它是一个非常优秀的库,是C++标准的最好实践之一,因此也经常被用于商业的开发。所以,如果你是搞C++的,还没有听过或用过boost,你就out了,想想自己是不是跟不上技术的步伐了,哈哈……

关于boost的地位,大家可以看看其官方文档:

We aim to establish "existing practice" and provide reference implementations so that Boost libraries are suitable for eventual standardization. Ten Boost libraries are included in the C++ Standards Committee's Library Technical Report (TR1) and in the new C++11 Standard. C++11 also includes several more Boost libraries in addition to those from TR1. More Boost libraries are proposed for standardization in C++17.

我们致力于建立(C++标准的)“现有实践”和参考实现,因此boost库都适合最终的标准。有10个boost库已经被包含在C++标准委员会的库技术报告(TR1)和新的C++11标准中。除了从TR1获得的几个库外,C++标准还包含了几个额外boost库。更多的boost库将可能被用于C++17标准中。

boost库的使用

以下讲述的是windows平台下的使用,开发的IDE是VS2010。

boost库的下载

你可以到其官网http://www.boost.org上去查找最新版本的boost,进行下载。也可以到这个链接直接下载1.57.0的boost:http://www.boost.org/users/history/version_1_57_0.html

boost的目录结构

boost_1_57_0\ ............................................Boost的根目录

   index.htm ..............................................www.boost.org中指导手册的一个副本

   boost\ .....................................................所有Boost的头文件

   lib\ ...........................................................预编译的二进制库

   libs\ .........................................................Tests, .cpps, docs, etc., by library

     index.html ........................................Boost库的使用手册的首页

     algorithm\

     any\

     array\

                     …更多的库…

   status\ ..................................................Boost-wide 测试包

   tools\ ....................................................常用工具,如. Boost.Build, 快速查询手册, bcp

   more\ ...................................................法律条款等

   doc\ .......................................................Boost库文档的一个子集

在项目中引入boost

1.你只需要将下载的boost压缩包解压即可,不需要任何安装。假设你的boost库是解压在E:\C++Workspace\boost_1_57_0目录下。

2.在VS2010下创建一个空的工程(我创建的是一个Win32 Console Application工程,假设工程名为BoostTest)。

3.右键点击你的工程名,选择Properties(属性),在弹出的对话框中选择 Configuration Properties > C/C++ > General ,在 Additional Include Directories中输入第1步解压的boost的根目录路径(如E:\C++Workspace\boost_1_57_0)

4.将BoostTest.cpp中的内容替换成以下的测试代码:

 
  1. #include "stdafx.h"

  2.  
  3. #include <boost/lambda/lambda.hpp>

  4. #include <iostream>

  5. #include <iterator>

  6. #include <algorithm>

  7.  
  8. int main()

  9. {

  10. using namespace boost::lambda;

  11. typedef std::istream_iterator<int> in;

  12.  
  13. std::for_each(

  14. in(std::cin), in(), std::cout << (_1 * 3) << " " );

  15. }



 

4.编译你的工程BoostTest,编译成功后运行(F5)。在弹出的控制台对话框中输入2 4 6后按Enter,将输出6 8 12的结果,说明测试成功,boost可以正常使用了。按Ctrl+C结束输入。

编译二进制的boost库

如果你想要使用任何单独编译的 Boost 库,你需要获得二进制的库文件。用Visual C++从源代码中编译二进制库的过程如下:

打开VS2010的命令提示符控制台:Windows开始菜单\Microsoft Visual Studio 2010\Visual Studio Tools\Visual Studio 2005 Command Prompt,用cd命令将当前目录定位到Boost的根目录(E:\C++Workspace\boost_1_57_0),输入如下两个命令:

编译命令一:

bootstrap

.\b2

第一个命令(bootstrap)会执行bootstrap.bat脚本,是用于准备需要使用的Boost.Build程序;第二个命令(.\b2)是调用Boost.Build程序构建独立编译的Boost库。

 

输入第一个命令(bootstrap)后需要等待一小段时间,当出现以下提示时,说明命令执行完毕。

这时Boost根目录会多出四个文件:

b2.exe:           Boost.Build程序,用于编译二进制的Boost库

bjam.exe :        Boost.Build程序,用于编译二进制的Boost库

bootstrap.log :    执行以上两个命令时记录的日志

project-config.jam: Boost.Build的配制参数

b2.exe 、bjam.exe 这两个exe作用是一样的,bjam.exe 是老版本,b2是bjam的升级版本。

输入第二个命令(.\b2)后进行编译,整个编译的过程会非常长,可能需要一个小时左右,请耐心等待。编译成功后会有如下提示:

 

这时你的Boost根目录下会多出个lib文件夹(笔者的是在.\stage\lib,可能每一台电脑或平台下不一样,请以命令行最后的提示为准,如上图),这就是编译出来的Boost的静态库和动态库。

编译命令二:

bootstrap

b2 --build-dir=.\lib toolset=msvc-10.0 --build-type=complete stage

我用编译命令一编译后,进行链接测试时,报以下错误:

error LNK2038: mismatch detected for '_MSC_VER': value '1800' doesn't match value '1600' in BoostTest.obj

error LNK2038: mismatch detected for '_MSC_VER': value '1800' doesn't match value '1600' in BoostTest.obj

error LNK2038: mismatch detected for '_MSC_VER': value '1800' doesn't match value '1600' in BoostTest.obj

error LNK2038: mismatch detected for '_MSC_VER': value '1800' doesn't match value '1600' in BoostTest.obj

error LNK2038: mismatch detected for '_MSC_VER': value '1800' doesn't match value '1600' in BoostTest.obj

error LNK2038: mismatch detected for '_MSC_VER': value '1800' doesn't match value '1600' in BoostTest.obj

error LNK1104: cannot open file 'libboost_regex-vc100-mt-gd-1_57.lib'

但我在\stage\lib目录下只找到相应的libboost_regex-vc120-mt-1_57.lib和libboost_regex-vc120-mt-gd-1_57.lib。

上网查了资料说是编译出来的Boost库是VC++11的,需要在VS2012上才能支持,VS2010不支持。因此需要重新设置选项,指定编译器的版本。

上面的命令,第一个命令(bootstrap)与编译命令一中含意相同,第二个命令b2 --build-dir=.\lib toolset=msvc-10.0 --build-type=complete stage的含意如下:

--build-dir                 编译Boost库时的工作目录,用于存放中间文件

toolset=msvc-10.0           toolset是C++编译器的集合,msvc-10.0表示微软VC++10.0编译器,VS2010支持。

--build-type=complete stage    “--build-type=complete” 导致Boost.Build 会编译出所有支持类型的Boost库

验证Boost库

为了验证上面编译出来的静态库,我们可以用以下一个简单的“主题提取”的程序来进行测试。

1.在“在项目中引入boost”中已经创建了一个BoostTest工程,右键点击你的工程名,选择Properties(属性),在弹出的对话框中选择 Configuration Properties > Linker > General ,在 Additional Library Directories中输入上面编译出来静态库的路径(如E:\C++Workspace\boost_1_57_0\stage\lib)

2.将BoostTest.cpp中的内容替换成以下代码

 
  1. #include "stdafx.h"

  2.  
  3. #include <boost/regex.hpp>

  4. #include <iostream>

  5. #include <string>

  6.  
  7. int main()

  8. {

  9. std::string line;

  10. boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" );

  11.  
  12. while (std::cin)

  13. {

  14. std::getline(std::cin, line);

  15. boost::smatch matches;

  16. if (boost::regex_match(line, matches, pat))

  17. std::cout << matches[2] << std::endl;

  18. }

  19. }

3.Build你的工程

4.在你工程编译出的Debug目录下会有一个可执行程序BoostTest.exe,在该目录下创建一个subject.txt文件,并将以下内容保存至subject.txt文件中。

To: George Shmidlap

From: Rita Marlowe

Subject: Will Success Spoil Rock Hunter?

---

See subject.

5.打开命令提示符,将当前目录定位到Debug目录下(如E:\C++Workspace\VS2010\BoostTest\

Debug),输入:BoostTest.exe < subject.txt。将会获取该文本的主题Will Success Spoil Rock Hunter?如果出现如下结果,说明验证成功。

 

可参考阅读:

http://www.boost.org/doc/libs/1_57_0/more/getting_started/windows.html#get-boost

http://www.cnblogs.com/zhcncn/p/3950477.html

猜你喜欢

转载自blog.csdn.net/f110300641/article/details/81865545