b2/bjam 参数说明:
b2
命令的功能强大,用起来也比较复杂,因此在使用之前,最好先查看一下该命令的帮助:
b2.exe --help
以下是一些比较重要的参数说明:
-
stage/install:
stage 表示只生成库(dll 和 lib),install 还会生成包含头文件的 include 目录。推荐使用 stage,因为 install 生成的 include 目录实际就是源码包下的 boost 目录,需要 include 的时候可以直接使用,不需要再次生成,这样可以节省大量的编译时间。
-
toolset:
指定编译器,可选的如 borland、gcc、msvc-14.0(VS2015)等。如果不指定,会自动搜索本地可用的编译器(可查看
./project-config.jam
文件以确认)。 -
without/with:
选择不编译/编译哪些库(类似于黑名单/白名单)。
--with-python
的含义是仅编译 python,其他的都不编译。反过来,如果用--without-python
,意思就是除了 python, 其他的都编译。with/without 参数可以多次出现,以限定多个库。如果不设置 with/without 参数,默认全部编译,可能需要几个小时的时间!需要注意,编译 Boost.python 需要确保本地安装了 Python,并且 python 命令已加入环境变量。
要查看 Boost 包含的所有库,可使用以下命令:
b2.exe --show-libraries
-
stagedir/prefix:
stage 时使用 stagedir,install 时使用 prefix,表示编译生成文件的路径。推荐给不同的编译环境指定不同的目录,如 Visual Studio 2015 的 x86 应用对应的是
bin/lib32-msvc-14.0
,x64 应用对应的是bin/lib64-msvc-14.0
。如果都生成到一个目录下,将没有任何益处,徒增管理难度。如果使用了 install 参数,那么还将在上述指定的目录下生成include
目录,用于保存头文件。 -
build-dir:
编译生成的中间文件的路径,默认是 Boost 根目录下的
bin.v2
目录,一般无需设置。 -
link:
指定生成动态链接库还是静态链接库,取值为
static|shared
。生成静态链接库使用 static,生成动态链接库需使用 shared。如不指定,默认使用 static。静态库的缺点是占用空间比较大,优点是程序发布的时候无需附带 Boost 库的 dll,比较整洁。推荐使用静态库的方式编译 Boost.python,这样发布程序的时候就不用 Boost 的 dll 了,并且也多占用不了太多空间。 -
runtime-link:
指定运行时是动态还是静态链接其他库。同样有 shared 和 static 两种方式。如果不指定,默认是 shared,一般无需设置。
-
threading:
要编译的库是单线程还是多线程,可取值
single|multi
。如果不指定,默认是 multi,一般无需设置。 -
variant
debug|release
,编译 debug 版本还是 release 版本。一般与最终发布的程序是 debug 还是 release 版相对应。如果不指定,默认两个都编译,一般无需设置。 -
address-model
编译成 32 位版本还是 64 位版本,可取值
32|64
。如果不指定,默认两个版本都编译。如果是编译 Boost.python,该参数就要与本地安装的 Python 位数相对应,否则编译会出错,因此最好设置一下。
Boost 静态库/动态库的命名规则
以 Boost.python 为例,如果编译的是静态库(link=static
),将会生成单个 .lib
文件:
libboost_python36-vc140-mt-gd-x32-1_68.lib
而如果编译的是动态库(link=shared
),将会生成两个文件(.lib
和 .dll
):
boost_python36-vc140-mt-gd-x32-1_68.lib
boost_python36-vc140-mt-gd-x32-1_68.dll
动态库虽然也生成 .lib
文件,但它与静态库的 .lib
文件差别很大。动态库的 .lib
更像是对 .dll
的声明,二者的关系类似于 .h
与 .cpp
的关系。因此,动态库中的 .lib
文件要比静态库的 .lib
文件小得多。
下面以静态库的命名规则为例进行分析:
libboost_python36-vc140-mt-sgd-x32-1_68.lib
| || | | | | | || ||| | | | |
- --- ------ --- -- - - - --
1 2 3 4 5 6 7 8 9
- 静态库以
lib
开头,动态库开头没有lib
。 - 所有的库都含有
boost
前缀。 - Boost 库名称,本例中为
python36
。 - 编译器名称及其版本,
vc140
指的是 msvc-14.0,对应 Visual Studio 2015。 - 有
mt
代表threading=multi
,没有则代表threading=single
。 - 有
s
代表runtime-link=static
,没有则代表runtime-link=shared
。 - 有
gd
代表 debug 版本,没有则代表 release 版本。 - 目标位数,
x32
代表 32 位,x64
代表 64 位。 - Boost 库的版本号,
1_68
代表 Boost 1.68 版本。