一、本次编译的是目前boost版本是: 1.82.0
我们可以先从
官网上下载对应版本的boost
二、Windows
windows平台编译boost需要先安装VS,打开命令行工具
这里直接选择的x64
命令行工具
然后在命令行中进入这个boost目录文件夹,执行脚本 .\bootstrap.bat
执行完成后,就会在当前目录生成一个可执行文件 b2.exe
后面就是通过这个可执行文件来编译源代码的
我们可以运行命令 b2.exe --help 来查看可选的编译选项
当然,也可以直接运行这个程序 b2.exe
我项目中需要配置的参数所以需要运行这个程序 b2.exe runtime-link=static
编译好后,其默认的安装路径为当前目录下的stage\lib
文件夹内
头文件就在下载当前目录的boost
目录里面
三、b2.exe 参数
1、stage/install
stage
表示只生成库(dll
和 lib
),install
还会生成包含头文件的 include
目录。推荐使用 stage
,因为 install
生成的 include
目录实际就是源码包下的 boost
目录,需要 include
的时候可以直接使用,不需要再次生成,这样可以节省大量的编译时间
事实上其默认就是这个选项,所以这两个选项不用填
2、toolset
指定编译器,可选的如 borland
、gcc
、msvc-14.3(VS2022)
等。如果不指定,会自动搜索本地可用的编译器(可查看 ./project-config.jam
文件以确认)
因此这个也不用填,其会自动搜索的
3、without/with
选择不编译/编译哪些库(类似于黑名单/白名单)。--with-python
的含义是仅编译 python
,其他的都不编译。反过来,如果用 --without-python
,意思就是除了 python
, 其他的都编译。with/without
参数可以多次出现,以限定多个库。如果不设置 with/without
参数,默认全部编译!
需要注意,编译 Boost.python
需要确保本地安装了 Python
,并且 python
命令已加入环境变量。
要查看 Boost
包含的所有库,可使用命令:b2.exe --show-libraries
所以默认也不用管,直接全部编译即可
4、stagedir/prefix
当用stage
命令时使用 stagedir
,而install
时使用 prefix
,表示编译生成文件的路径
默认不填就是用的stage
命令,所以可以设置stagedir
值,以自定义保存库的路径,不指定路径,默认为./stage
目录下
5、build-dir
编译生成的中间文件的路径,默认是 Boost
根目录下的 bin.v2
目录,一般无需设置
6、link
指定生成动态链接库还是静态链接库,取值为 static|shared
。生成静态链接库使用 static
,生成动态链接库需使用 shared
。如不指定,默认使用 static
静态库的缺点是占用空间比较大,优点是程序发布的时候无需附带 Boost
库的 dll
,比较整洁。推荐使用静态库的方式编译,即默认即可,不用填
7、runtime-link
指定运行时是动态还是静态链接C/C++运行时库。同样有 shared
和 static
两种方式。如果不指定,默认是 shared
,一般无需设置,默认即可
8、threading
要编译的库是单线程还是多线程,可取值 single|multi
。如果不指定,默认是 multi,一般无需设置
9、variant
可选值为:debug|release
,编译 debug
版本还是 release
版本。如果不指定,默认两个都编译,一般无需设置,都编译即可
10、address-model
编译成 32
位版本还是 64
位版本,可取值 32|64
。如果不指定,默认两个版本都编译
四、Boost 静态库/动态库的命名规则
以 Boost.atomic
为例,如果编译的是静态库(link=static
),将会生成单个 .lib
文件例如:libboost_atomic-vc143-mt-gd-x64-1_81.lib
而如果编译的是动态库(link=shared),将会生成两个文件(.lib
和 .dll
)
libboost_atomic-vc143-mt-gd-x64-1_81.lib
libboost_atomic-vc143-mt-gd-x64-1_81.dll
动态库虽然也生成 .lib
文件,但它与静态库的 .lib
文件差别很大。动态库的 .lib
更像是对 .dll
的声明,二者的关系类似于 .h
与 .cpp
的关系。因此,动态库中的 .lib
文件要比静态库的 .lib
文件小得多
下面以静态库的命名规则为例进行分析:
libboost_atomic-vc143-mt-gd-x64-1_82.lib
| || | | | | | || ||| ||
- --- ---- --- - -- -- --
1 2 3 4 5 6 7 8
- 静态库以
lib
开头,动态库开头没有lib
。 - 所有的库都含有
boost
前缀。 - 库名称,本例中为
atomic
。 - 编译器名称及其版本,
vc143
指的是msvc-14.3
,对应Visual Studio 2022
。
- Visual Studio 2022-14.3
- Visual Studio 2019-14.2
- Visual Studio 2017—14.1
- Visual Studio 2015—14.0
- Visual Studio 2013—12.0
- Visual Studio 2012—11.0
- Visual Studio 2010—10.0
- Visual Studio 2008—9.0
- Visual Studio 2005—8.0
- Visual Studio .NET 2003—7.1
- Visual Studio .NET—7.0
- Visual Studio 6.0, Service Pack 5–6.5
- 有
mt
代表threading=multi
,没有则代表threading=single
。 - 有
gd
代表debug
版本,没有则代表release
版本。 如果为sgd
,前面的s
代表runtime-link=static
,没有则代表runtime-link=shared
。 - 目标位数,
x32
代表32
位,x64
代表64
位。 Boost
库的版本号,1_82
代表Boost 1.82
版本。