boost库编译过程如下:
1、下载boost库(本实例用的boost1.63)并解压
2、进入boost库解码目录,执行bootstrap.bat,生成b2或bjam可执行编译工具;
3、利用b2或bjam编译boost库(进入cmd命令行,然后进入boost解码目录--b2工具所在目录)
在不特定指定编译选项情况下,boost是编译成动态库,32bit,默认安装在boost解压目录,lib编译在boost解码目录下的子目录stag/lib下,使用环境根据vs默认命令行确定:
b2 toolset=msvc-14.0 architecture=x86 address-model=64 link=static variant=debug,release threading=multi runtime-link=static --with-coroutine --with-context --with-container --with-graph --with-signals --with-signals --with-iostreams --with-filesystem --with-date_time --with-thread --with-serialization --with-regex --with-system --with-program_options --with-math --with-mpi --with-python --with-wave --with-test --with-atomic --with-chrono --with-exception --with-locale --with-log --with-random --with-timer --stagedir="E:\boost_1_63_0\64" --build-dir="E:\boost_1_63_0\64\build"
(1)动态库编译
指定编译选项:link=shared
(2)静态库编译
指定编译选项:link=static runtime-link=static ,其中link表示编译静态库,runtime-link表示静态连接c++运行库
(3)选择编译
boost库有很多字库,如boost1.63支持的库有(通过命令行b2 --show-libraries查看当前boost库支持命令--help查看帮助):
The following libraries require building:
- atomic
- chrono
- container
- context
- coroutine
- coroutine2
- date_time
- exception
- fiber
- filesystem
- graph
- graph_parallel
- iostreams
- locale
- log
- math
- metaparse
- mpi
- program_options
- python
- random
- regex
- serialization
- signals
- system
- test
- thread
- timer
- type_erasure
- wave
如果不需要完全编译,而是想通过指定组件名编译,则需要手动指定你需要的组件,使用--with-组件名,如--with-date_time
(4)完全编译
如果需要编译所有库则不需要单独指定--witch-组件名,直接使用编译选项:--build-type=complete
(5)带安装编译
默认情况下不指定prefix和install,不会安装库到指定目录,如果添加--prefix选项且含有install关键字
如:--stagedir="E:\boost_1_63_0\64" --build-dir="E:\boost_1_63_0\64\build" 指定编译库和中间文件路径
如:--prefix=”E:\boost_1_63_0\include" install 则拷贝boost所有的头文件到include
(6)编译不同C++版本
如vs2015版本,则指定工具集为toolset=msvc-14.0,vs2008为msvc-9.0,vs2010为msvc-10.0,vs2013为msvc-12.0,vs2017为msvc-15.0
(7)编译不同系统位
如果编译32位,则使用architecture=x86 address-model=32
如果编译64为,则使用architecture=x86 address-model=64
其中architecture=x86指定cpu为x86系列,address-model指定使用32位地址还是64位地址;
4、编译选项详情
--build-type=complete 表示编译所有版本(编译所有版本,不然只会编译一小部分版本(确切地说是相当于:variant=release, threading=multi;link=shared|static;runtime-link=shared))
(1)toolset:表示编译器工具,我安装的是VS2010,所以是msvc-10.0;
具体的版本对应关系,可以查看boost_1_62_0\tools\build\src\tools\msvc.jam中的# Version aliases节
# Version aliases.
.version-alias-6 = 6.0 ;
.version-alias-6.5 = 6.0 ;
.version-alias-7 = 7.0 ;
.version-alias-8 = 8.0 ;
.version-alias-9 = 9.0 ;
.version-alias-10 = 10.0 ;
.version-alias-11 = 11.0 ;
.version-alias-12 = 12.0 ;
.version-alias-14 = 14.0 ;
(2)architecture:表示架构,也就是你的CPU架构,因为我安装的是win7 32位,所以使用了x86的架构
(3)instruction-set:表示指令集,依然是8086指令集
(4)address-model:表示地址长度为32位或64 要有address-model=64属性,如果没有这个属性的话,会默认生成32位的平台库,加入这个选项才能生成64位的DLL
(5)link:表示生成动态/静态链接库,动态链接库是shared,静态链接库是static,一般都会编译成静态库,因为给出程序的时候打包boost的库会非常庞大
(6)variant:表示生成的Debug或者release版本,一般情况下会两种版本都会编译出来的
(7)threading:表示单/多线程编译,一般我们的程序都会用到多线程,所以选择了multi
(8).runtime-link:表示动态/静态链接C/C++运行时库(C/C++ Runtime),我们选择了动态链接
(9)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。
(10)stage/install:stage表示只生成库文件(DLL和Lib),install还会生成包含头文件的include目录,推荐使用stage,因为boost_1_62_0\boost中就是boost库完整的头文件,所以无需再拷贝一份出来。编译出来的库会放在stage文件夹中
(11)stagedir/prefix:stage时使用stagedir,install时使用prefix,表示编译生成文件的路径。推荐给不同的IDE指定不同的目录,如VS2008对应的是E:\SDK\boost\bin\vc9,VC6对应的是E:\SDK\boost\bin\vc6,否则都生成到一个目录下面,难以管理。如果使用了install参数,那么还将生成头文件目录,vc9对应的就是E:\SDK\boost\bin\vc9\include\boost-1_46\boost,vc6类似(光这路径都这样累赘,还是使用stage好)。
5、其他选项
--build-dir=
--stagedir=
--build-type=complete 编译所有版本,不然只会编译一小部分版本(确切地说是相当于:variant=release, threading=multi;link=shared|static;runtime-link=shared)
variant=debug|release 决定编译什么版本(Debug or Release?)
link=static|shared 决定使用静态库还是动态库。
threading=single|multi 决定使用单线程还是多线程库。
runtime-link=static|shared 决定是静态还是动态链接C/C++标准库。
--with-
--show-libraries 显示需要编译的库名称