使用环境
Boost1.42.0 + VS2008 + Win7
在官网(www.boost.org)下载boost_1_42_0.7z,然后解压。目前最新的版本为1.61.0,选1.42.0这个这个版本主要是为了和《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文件夹(根目录)下。
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的使用
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=
Install architecture independent files here.
--exec-prefix=
Install architecture dependent files here.
--libdir=
Install library files here.
--includedir=
Install header files here.
[stage]
--stagedir=
存放编译后的库文件的路径,默认是stage
[Options]
--build-type=
minimal(默认)
complete<所有可能的版本都会被编译>
--build-dir=
编译的临时文件会放在builddir里(编译完就可以把它删除了)
--show-libraries
显示要编译的库名称
--layout=
--with-
只编译指定的库,如输入--with-regex就只编译regex库了
--without-
指定不编译的库
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 |
multi |
debug |
static |
shared |
libboost_thread-vc90-mt-gd.lib |
multi |
debug |
shared |
shared |
boost_thread-vc90-mt-gd.lib |
multi |
release |
static |
static |
libboost_thread-vc90-mt-s.lib |
multi |
release |
static |
shared |
libboost_thread-vc90-mt.lib |
multi |
release |
shared |
shared |
boost_thread-vc90-mt.lib |
最后测试一下使用--build-type指令进行编译的效果
bjam --stagedir=P:\xy\output --with-date_time --build-type=complete
关于link和runtime-link的解释
参考资料:
[1]. 罗剑锋 著《Boost程序库完全开发指南》
[2]. http://www.cnblogs.com/zhcncn/p/3950477.html
[3]. http://www.cnblogs.com/lidabo/p/3782193.html