虽然很多Boost组件都只有头文件,不需要编译,但是有些Boost组件,如program_options、regex等还是需要编译生成库的。考虑到目前的程序需要用到program_options、regex等组件,还可能用到filesystem组件,所以还是决定先把Boost编译一下。

  习惯性的找Boost某个组件或者整个Boost的*.dsp或者*.sln文件,没找到。于是只好老老实实地去看文档,Getting Started on Windows一节有说,需要获得bjam。得,先编译bjam吧。好在bjam的源码也在Boost源码包中,不需要特别去下载。

  进入tools/jam目录(习惯用/来表示目录分隔,写起来方便),一眼就看见了,build_dist.bat,运行它当然是可以得到bjam.exe的,但是貌似这个批处理还干了些其它的事情,所以还是根据各方面的资料,再进入stage目录,找到build.bat来运行。这个批处理还算聪明,居然能自己配置VC的相关路径。

  跑tools/jam/stage/build.bat没遇到啥问题。结果在stage下面产生了bin.ntx86和boost-jam-3.1.17-1-ntx86等目录——如果jam版本不一样,举一反三。这两个目录下都有bjam.exe,一样的,不过看起来,boost-jam-3.1.17-1-ntx86目录更像是发行目录,因为这里面只有bjam.exe和license说明。我本来也不准备要改PATH环境,所以随便找一个bjam.exe拷贝到boost主目录下去,准备编译。

  有了bjam之后要编译boost就简单了,直接到命令行下运行bjam就OK(貌似不到命令行下直接双击运行也行)。不过这样据说会编译全部boost库和N种配置,费时还浪费磁盘空间。我只会用到上面说的三个组件,只编译那三个组件,每个两种配置(debug一种,release一种)就好。为了省时省空间,就费点力自己写几个命令吧。运行个bjam --help,看看命令行是咋个写的:

Usage:
bjam [options] [properties] [install|stage]

  命令行道是简单,就是选项+属性+目标。目标就两个install和stage,其中install根据指定的安装目录,把头文件和编译出来的.lib都拷贝过去——浪费空间,就选stage吧,默认就是,都不用特别指定了。

  选项用默认的也行,有几个属性可能需要修改:

  1. --with-<library>,这个选项指定需要编译的组件。如果不指定,就是编译全部Boost库。其中<library>就是Boost主目录下libs目录中的子目录名。比如编译正则表达式库这个选项设置为:--with-regex。

  2. --stagedir=<dir>,这个选项指定编译的结果拷贝到哪里。bjam会把编译生成的*.lib和*.dll拷贝到指定目录下的lib目录。默认是Boost主目录下的stage目录。其实,就用默认值挺好的。

  3. --build-type=complate,意思是尝试所有可能的组合,比如多线程静态,多线程DLL等。在使用--with参数指定了组件的情况下,使用这个选项可以少些配置。不过编译出来的东西还是很可观,一个组件的这些库产生出来至少要占几十M的空间。所以,我宁愿不用这个选项,配置下面要提到的编译属性来选择性的编辑Boost组件。

  属性(properties)有这么一些:

  toolset=toolset
variant=debug|release
link=static|shared
threading=single|multi
runtime-link=static|shared

  toolset指定编译工具集,可用的工具集在文档中有个列表。在Windows下一般是用VC编译,对应的工具集是msvc。如果不指定toolset,默认也是用的msvc。

  variant指定编译的是debug版本还是release版本。分别用于VC项目中的Debug配置和Release配置。

  link是指编译出来的Boost组件库是静态还是动态。静态Boost组件库会直接链接到你的项目中,而动态组件库会产生一个相应的.dll文件,运行时需要这个.dll文件的支持(配置在PATH中或放置在应用程序所在目录)。我觉得犯不着随一个应用程序发布一大堆动态库,而且你的.exe就算编译成10M,在如今的磁盘空间和网速下,都是可以接受的,所以一般都配置成static了。

  threading,指定连接单线程还是多线程的C++运行时库。

  runtime-link,指定C++运行时库是用静态的还是动态的。

  这些属性中,variant、threading和runtime-link是可以根据VC项目的“运行库”配置(在项目属性→C/C++→代码生成→运行库)来决定的。比如下表:

运行库设置对应的Boost编译属性配置
运行库设置 variant threading runtime-link
多线程(/MT) release multi static
多线程调试(/MTd) debug multi shared
多线程DLL(/MD) release multi static
多线程调试DLL(/MDd) debug multi shared

  因为我的VC 2008 Express没有单线程的相关配置,所以只列了多线程的项出来。如果要为单线程的“运行库”配置Boost编译属性,只需要相应地把threading的值改为single就行了。

  总的来说,编译命令也不是很麻烦。比如,编译正则表达式的“多线程调试DLL”和“多线程”两种配置,就用下面两个命令来分别完成:

D:/boost_1_39_0>bjam toolset=msvc link=static threading=multi variant=debug runtime-link=shared --with-regex

D:/boost_1_39_0>bjam toolset=msvc link=static threading=multi variant=release runtime-link=static --with-regex

  编译Boost用的是非常规方法,所以写这篇博客备忘。

boost安装的更多相关文章

  1. 解决 Boost安装:fatal error: bzlib.h: No such file or directory 问题

    参考: How to install all the boost development libraries? 解决 Boost安装:fatal error: bzlib.h: No such fil ...

  2. 【Todo】Boost安装与学习

    现在这里找下载包 http://sourceforge.net/projects/boost 我找的是 1_62_0 下面是从公司wiki上找到的一个说明. boost & thrift安装步 ...

  3. Linux平台的boost安装全解

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...

  4. linux boost 安装

    sudo apt-get install libboost-dev 但是,我这样安装以后,编译程序时出现了很多错误,而且都是系统文件的错误.我开始以为是我的boost库版本不对,后来换了好几个版本,都 ...

  5. boost安装缺少libboost_iostreams.so

    编译安装boost库: 1 ./bootstrap.sh 2 ./bjam 3 ./b2 install 但安装boosth后,发现缺少libboost_iostreams.so库,后发现boost库 ...

  6. c++ 库 boost安装

    http://blog.chinaunix.net/uid-12226757-id-3427282.html ubuntu apt-get install libboost-dev 全部: apt-g ...

  7. Boost 安装详解

    一 Linux(redhat)篇 1.1 获取boost库 解压tar -zxvf boost_1.48.0.tar.gz 进入解压目录cd boost_1_48_0 1.2 编译安装 使用下面的命令 ...

  8. 【视频开发】【计算机视觉】doppia编译之二:boost安装

    编译安装boost库的方法大部分都是来自http://www.linuxidc.com/Linux/2013-07/87573.htm这篇文章,这里我用自己的语言重新组织,稍作修改和补充,最主要是方便 ...

  9. 解决CentOS下boost安装后不能使用的问题

    先说一说整个经历. 因为之前没有注意到gcc4.8.5比较旧,就已经安装好boost了,当时已经可以使用了,后来发现gcc太老了,一些软件安装需要比较新的gcc支持,所以决定升级gcc,结果boost ...

随机推荐

  1. linux之磁盘配额(quota)

    1.什么是quota 简单的说就是限制用户对磁盘空间的使用量. 因为Linux是多用户多任务的操作系统,许多人共用磁盘空间,为了合理的分配磁盘空间,于是就有了quota的出现. 2.quota的用途  ...

  2. state/ui-router

    state/ui-router 一个状态对应于一个页面位置 通过定义controller.template和view等属性,来定义指定位置的用户界面和界面行为 通过嵌套的方式来解决页面中的一些重复出现 ...

  3. [书目20131223]Android、iPhone、Windows Phone手机网页及网站设计:最佳实践与设计精粹 - 张亚飞

    目录 第I篇 手机版专用网站设计和开发入门篇 第1章 准备创作环境和测试环境 3 1.1 使用Mobile Safari测试网页 4 1.1.1 iOS Simulator安装 5 1.1.2 使用M ...

  4. 剑指Offer06 旋转数组的最小值

    /************************************************************************* > File Name: 06_MinNum ...

  5. Table of Contents - MongoDB

    Getting Started Installation Installing MongoDB on Windows Installing MongoDB on Linux Introduction ...

  6. css子元素的margin-top为何会影响父元素

    详细内容请点击 这个问题困惑了很久,虽然没有大碍早就摸出来怎么搞定它,但始终不明白原因出在哪里,如果只是IE有问题我也不会太在意,可问题是所有上等浏览器都表现如此,这样叫我怎能安心?今天总算下狠心查出 ...

  7. ASP.NET Ajax简单的无刷新分页

    最近练习了一些AJAX无刷新分页,写得比较简单,性能不知道怎么样,求大神指点,如有更好的分页提供,欢迎交流! 发话不多说了,直接上代码! 首先从网上下了一个JS分页,感觉挺好用的 (function( ...

  8. WIN7系统操作快捷键

    轻松访问 按住右Shift八秒钟:启用或关闭筛选键 按左 Alt+左 Shift+PrntScrn(或 PrntScrn):启用或关闭高对比度 按左 Alt+左 Shift+Num Lock :启用或 ...

  9. 基于jquery的inputlimiter 实现字数限制功能

    html代码: <td>内容摘要:</td> <td> <textarea id="content_summary" rows=5 nam ...

  10. BeanDefinition的Resource定位——3

    1.我们重点看看AbstractRefreshableApplicationContext的refreshBeanFactory方法的实现,这个refreshBeanFactory被FileSyste ...