zoukankan      html  css  js  c++  java
  • windows下编译和安装boost库

    boost是一个功能强大、构造精巧、跨平台、开源并且完全免费的C++程序库。

    获取方式

    boost提供源码形式的安装包,可以从boost官方网站下载,目前最新版本是1.59.0。
    boost_download

    本机上正好有boost_1_55_0的源码包,就不下载最新版本,就以boost_1_55_0为例说明,安装编译方式对1.59.0版本同样使用。

    目录结构

    源码包解压后的目录结构:

    BOOST_1_55_0 	#boost根目录,存放配置脚本和说明文件 
    ├─boost  		#所有boost库头文件,90%以上的boost库源码都在这里
    ├─doc  			#文档
    ├─libs  		#所有组件的示例/测试/编译代码和说明文档
    ├─more  		#库作者相关的文档
    ├─status  		#可用于测试boost库的各个组件
    └─tools 		#b2、quickbook等一些自带的工具
    

    boost子目录是最为重要的目录。以头文件的形式分门别类存放了要使用的库代码:

    ├─accumulators		#累加器库
    ├─algorithm			#算法库
    ├─archive			#序列化库
    ├─asio				#异步并发库
    ├─assign			#赋值初始化库
    ├─atomic			#原子操作库
    ├─bimap				#双向关联数组
    ├─bind				#bind表达式
    ├─chrono			#时间处理库
    ├─circular_buffer	#循环缓冲区容器
    ...					#其他库
    ...
    └─xpressive			#正则表达式库
    

    boost库使用方式

    boost库大多数组件不需要编译链接就可以使用,在自己的工程中直接包含头文件即可。
    如要使用boost xpressive正则库(与regex库不同,该正则库不需要编译),只需要在自己的源代码中包含头文件#include <boost/xpressive/xpressive_dynamic.hpp>即可。

    以下是必须编译成静态库或动态库才能使用的boost库:

    The following libraries require building:
        - atomic
        - chrono
        - context
        - coroutine
        - date_time
        - exception
        - filesystem
        - graph
        - graph_parallel
        - iostreams
        - locale
        - log
        - math
        - mpi
        - program_options
        - python
        - random
        - regex
        - serialization
        - signals
        - system
        - test
        - thread
        - timer
        - wave
    

    注: b2 --show-libraries命令可查看所有必须编译才能使用的库。

    编译安装boost

    首先打开命令行,进入boost源码安装包的根目录,执行bootstrap.bat脚本,该脚本为boost.build系统运行准备环境,是编译前的配置工作。

    bootstrap.bat

    执行完该脚本后,在boost源码安装包的根目录会生成b2.exebjam.exe两个可执行文件,这两个文件是一样的,只是名字不同。就是使用这两个可执行文件来编译安装boost库的。

    (1) 完全安装boost
    bjam --buildtype=complete

    (2) 定制安装boost
    完整编译boost费时费力,而且这些库在并不可能在开发中全部用到,因此只需编译需要的库即可。

    命令:bjam --show-libraries
    可查看所有必须编译才能使用的库。

    单独编译安装regex库:

    bjam stage --with-regex link=static runtime-link=shared threading=multi
    

    编译结果在stagelib目录下生成regex库(Debug/Release):

    libboost_regex-vc100-mt-1_55.lib
    libboost_regex-vc100-mt-gd-1_55.lib
    

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

    更多详细的参数说明,请参考这篇文章

    stage/install:stage表示只生成库(dll和lib),install还会生成包含头文件的include目录。本人推荐使用stage,因为install生成的这个include目录实际就是boost安装包解压缩后的boost目录(E:SDKoostoost,只比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:SDKoostinvc9,VC6对应的是E:SDKoostinvc6,否则都生成到一个目录下面,难以管理。如果使用了install参数,那么还将生成头文件目录,vc9对应的就是E:SDKoostinvc9includeoost-1_46oost,vc6类似(光这路径都这样累赘,还是使用stage好)。

    build-dir:编译生成的中间文件的路径。这个本人这里没用到,默认就在根目录(E:SDKoost)下,目录名为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版本,所以两个都编译。

    使用boost

    将头文件的include目录和所依赖的库文件添加的相应的IDE路径下面即可。
    关于静态库与动态库的使用可以参见之前写的C++静态库与动态库

    测试代码:

    #include <string>
    #include <iostream>
    #include <cassert>
    #include <boost/regex.hpp>
    
    using std::string;
    using std::cout;
    using std::endl;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	
    	boost::regex reg("\d{2,3}");
    	assert(boost::regex_match("234",reg) == true);
    
    	return 0;
    		
    }
    

    运行OK.

    参考文档:
    【Boost库初探】Boost.Regex库编译、使用(32位/64位):http://m.blog.csdn.net/blog/top_along/42717223
    Boost库编译后命名方式:http://www.cnblogs.com/yaoyansi/articles/1864702.html
    Windows下编译和安装Boost库的指定模块:http://grow.sinaapp.com/?p=1155
    Boost下载安装编译配置使用指南(含Windows、Linux以及ARM Linux):http://www.cnblogs.com/wondering/archive/2009/05/21/boost_setup.html

  • 相关阅读:
    flex + bison multiple parsers
    Educational Codeforces Round 95 (Rated for Div. 2)
    python学习笔记 day20 序列化模块(二)
    python学习笔记 day20 常用模块(六)
    python 学习笔记 常用模块(五)
    python学习笔记 day19 常用模块(四)
    python学习笔记 day19 常用模块(三)
    python学习笔记 day19 常用模块(二)
    python学习笔记 day19 作业讲解-使用正则表达式实现计算器
    python学习笔记 day19 常用模块
  • 原文地址:https://www.cnblogs.com/cmranger/p/4759223.html
Copyright © 2011-2022 走看看