Boost库的编译(Windows)

1 Boost库的编译

使用环境

Boost1.42.0 + VS2008 + Win7

1.1下载Boost

在官网(www.boost.org)下载boost_1_42_0.7z,然后解压。目前最新的版本为1.61.0,选1.42.0这个这个版本主要是为了和《Boost程序库完全开发》一书一致。

1.3 编译Boost

在VS2008环境下,使用【工具】-【VS2008命令提示行】

通过“P:”进入P盘,通过cd 指令进入子目录,最终进入“boost_1_42_0\tools\jam\src”目录并运行build.bat。

运行结束之后,在“boost_1_42_0\tools\jam\src\bin.ntx86”目录下生成bjam.exe文件。

将bjam.exe拷贝到boost_1_42_0文件夹(根目录)下。

  1. 在命令行环境下,进入boost_1_42_0目录执行bjam.exe编译命令:

bjam --stagedir=P:\xy\output --with-thread link=static threading=multi runtime-link=shared stage variant=debug

之所以选择这样的编译选项,是前面提示无法打开“libboost_thread-vc90-mt-sgd-1_42.lib”。

执行编译指令:

bjam --stagedir=P:\xy\output --with-date_time link=static threading=multi runtime-link=shared stage variant=debug

因为线程中的超时机制会用到时间库,所以使用thread组件的同时还需要编译date_time库。

由于使用的是静态库文件,所以只需要添加“附加库目录”即可(不用添加附加依赖项)。

另外,运行库需要设置为“多线程调试(/MTd)”,如果为“多线程调试DLL(/MDd)”则还需编译“libboost_thread-vc90-mt-gd-1_42.lib”文件。

3 bjam的使用

Boost库的编译(Windows)

Bjam [options][properties][install|stage]

[properties]

--toolset=toolset

指定进行编译的工具集(编译器)

msvc-6.0:VC6.0/msvc-7.0:VS2003/msvc-8.0:VS2005/msvc-9.0:VS2008/msvc-10.0: VS2010

variant=debug|release

决定编译用什么版本(Debug or Release)

link=static|shared

决定使用静态库还是静态库

threading=single|multi

决定使用单线程还是多线程

runtime-link=static|shared

决定是静态还是动态链接C/C++标准库

[install]

--prefix=<PREFIX>

 Install architecture independent files here.

--exec-prefix=<EPREFIX>

Install architecture dependent files here.

--libdir=<DIR>

Install library files here.

--includedir=<HDRDIR>

Install header files here.

[stage]

--stagedir=<STAGEDIR>Install library files here.

存放编译后的库文件的路径,默认是stage

[Options]

--build-type=<type>

minimal(默认)<variant=release threading=multi link=static|shared runtime-link=shared>

complete<所有可能的版本都会被编译>

--build-dir=<builddir>

编译的临时文件会放在builddir里(编译完就可以把它删除了)

--show-libraries

显示要编译的库名称

--layout=<layout>

--with-<library>

只编译指定的库,如输入--with-regex就只编译regex库了

--without-<library>

指定不编译的库

1)输入指令

bjam --stagedir=P:\YuWei\output --with-thread link=static threading=multi runtime-link=static stage variant=debug 

输出文件:

libboost_thread-vc90-mt-sgd.lib

libboost_thread-vc90-mt-sgd-1_42.lib

2)输入指令

bjam --stagedir=P:\YuWei\output --with-thread link=static threading=multi runtime-link=shared stage variant=debug

输出文件:

libboost_thread-vc90-mt-gd.lib

libboost_thread-vc90-mt-gd-1_42.lib

3)输入指令

bjam --stagedir=P:\YuWei\output --with-thread link=shared threading=multi runtime-link=shared stage variant=debug

输出文件:

boost_thread-vc90-mt-gd.lib

boost_thread-vc90-mt-gd-1_42.lib

boost_thread-vc90-mt-gd-1_42.dll

4)输入指令

bjam --stagedir=P:\YuWei\output --with-thread link=shared threading=multi runtime-link=staitc stage variant=debug

输出文件:无

5)输入指令

bjam --stagedir=P:\YuWei\output --with-thread link=static threading=multi runtime-link=static variant=release

输出文件:

libboost_thread-vc90-mt-s.lib

libboost_thread-vc90-mt-s-1_42.lib

6)输入指令

bjam --stagedir=P:\YuWei\output --with-thread link=static threading=multi runtime-link=shared variant=release

输出文件:

libboost_thread-vc90-mt.lib

libboost_thread-vc90-mt-1_42.lib

7)输入指令

bjam --stagedir=P:\YuWei\output --with-thread link=static threading=multi runtime-link=shared variant=release

输出文件:

boost_thread-vc90-mt.lib

boost_thread-vc90-mt-1_42.lib

boost_thread-vc90-mt-1_42.dll

8)输入指令

bjam --stagedir=P:\YuWei\output --with-thread link=shared threading=multi runtime-link=static variant=release

输出文件:无

通过以上实际编译测试可以发现:

link=static:静态库(生成文件名称以“lib”开头)

link=shared:动态库(生成文件名称无“lib”开头)

threading=mult:支持多线程。生成的库文件名称中包含“-mt”

threading=single:支持单线程。生成的库文件名称中不包含“-mt”

variant=release:生成的库文件名称不包含“-gd”

variant=debug:生成的库文件名称包含“-gd”

runtime-link=static:静态链接C/C++标准库,生成库文件名称包含“-s”

runtime-link=shared:动态链接C/C++标准库,生成的库文件名称不包含“-s”

Bjam编译选项有4个,理论上有16种配置方式,实际使用的多为多线程(threading=multi),另外通过上面的实际测试发现link=shared、runtime-link=shared这种配置不可用,所以实际只有以下6种情况:

threading

variant

link

runtime-link

putout-lib

multi

debug

static

static

libboost_thread-vc90-mt-sgd.lib
libboost_thread-vc90-mt-sgd-1_42.lib

multi

debug

static

shared

libboost_thread-vc90-mt-gd.lib
libboost_thread-vc90-mt-gd-1_42.lib

multi

debug

shared

shared

boost_thread-vc90-mt-gd.lib
boost_thread-vc90-mt-gd-1_42.lib
boost_thread-vc90-mt-gd-1_42.dll

multi

release

static

static

libboost_thread-vc90-mt-s.lib
libboost_thread-vc90-mt-s-1_42.lib

multi

release

static

shared

libboost_thread-vc90-mt.lib
libboost_thread-vc90-mt-1_42.lib

multi

release

shared

shared

boost_thread-vc90-mt.lib
boost_thread-vc90-mt-1_42.lib
boost_thread-vc90-mt-1_42.dll

最后测试一下使用--build-type指令进行编译的效果

bjam --stagedir=P:\xy\output --with-date_time --build-type=complete

关于link和runtime-link的解释

Boost库的编译(Windows)

参考资料:

[1]. 罗剑锋 著《Boost程序库完全开发指南》

[2]. http://www.cnblogs.com/zhcncn/p/3950477.html

[3]. http://www.cnblogs.com/lidabo/p/3782193.html