https://blog.csdn.net/yasi_xi/article/details/8660549
参考:
http://bbs.sjtu.edu.cn/bbscon,board,C,file,M.1300328832.A.html
http://noteonx.blogspot.com/2009/04/boost.html
【原】Boost下载安装编译配置使用指南(含Windows、Linux以及ARM Linux) - Terry Wang - 博客园
./b2参数解释:
参数: --toolset=msvc-11.0
msvc版本是14.3即VS2022. 库的名称中包含此版本143, 例如: libboost_log-vc143-mt-1_79.lib
参数: link=static
boost静态库,库的名称以libboost开头; 例如: libboost_log-vc143-mt-1_79.lib
该参数可选的取值为: "shared" "static"
参数: runtime-link=static
系统运行库以静态方式加载. 生成的库命名中有"s"; 例如: libboost_log-vc143-mt-sgd-1_79.lib
若参数改为 runtime-link=shared , 则 msvc的运行库,以共享的方式加载. 生成的boost库名称中没有"s"
该参数可选的取值为: "shared" "static"
参数: threading=multi
生成的库是多线程. 现在的应用程序大部分是多线程的.
该参数的可选的取值为: "single" "multi"
参数: variant=debug
生成debug版本的库, 库的命名中有"gd"; 例如: libboost_date_time-vc110-mt-sgd-1_60.lib
该参数取值范围: "debug" "release" "profile" "debug-python"
参数: address-model=64
生成64位的库. 不写该参数, 则默认为生成32位的链接库.
该参数可选的参数取值为: "16" "32" "64" "32_64"
--clean
Remove targets instead of building
-a
Rebuild everything
./b2的C / C++库的参数搭配形式
boost库在build时,./b2 install 后面可以跟一些参数,涉及到动态库、静态库的参数有以下四种搭配方式:
link=static runtime-link=static
link=static runtime-link=shared
link=shared runtime-link=shared
link=shared runtime-link=static (这种配置我试的结果是,报错,这样的搭配是非法的)
究竟它们都是什么意思呢?
我的粗浅理解:
link=static runtime-link=static
build出来的就是.a (windows .lib) 文件,没有.so (windows .dll) 文件,link到可执行程序中以后,就成为后者的一部分,和后者融为一体了
link=static runtime-link=shared
build出来的同时有 .a (windows .lib) 文件和 .so (windows .dll) 文件,link时,是指定 .a (windows .lib) 文件,后者成为可执行程序的一部分,运行时,通过融入可执行程序的 .a (windows .lib) 的信息,去动态加载 .so (windows .dll) 文件,其实质仍然是动态链接
link=shared runtime-link=shared
build出来的只有 .so (windows .dll) 文件,没有.a (windows .lib) 文件,但是,可执行程序在运行时,怎么找到动态库文件并加载它呢?
网上看到的最多的介绍文章是下面这样的:
link:生成动态链接库/静态链接库。生成动态链接库需使用shared方式,生成静态链接库需使用 static方式。
runtime-link:动态/静态链接C/C++运行时库。同样有shared和static两种方 式,这样runtime-link和link一共可以产生4种组合方式。虽然它和link属性没有直接关系,但我们习惯上,一个工程如果用动态链接那么所 有库都用动态链接,如果用静态链接那么所有库都用静态链接。所以这样其实只需要编译2种组合即可,即link=shared runtime-link=shared和link=static runtime-link=static。
还有人总结windows下boost库的命名特点:
link=static runtime-link=static 得到 libboostxxxxx.lib
link=shared runtime-link=shared 得到 boostxxxx.lib 和 boostxxxx.dll
由以上的文件夹层次结构基本就可以得出结论:
1、以“lib”开头的是“link-static”版本的,而直接以“boost”开头的是“link-shared”版本的。
2、有“d”的为debug版本,没有的则是release版本。
3、有“s”的为“runtime-link-static”版本,没有的则是“runtime-link-shared”版本。
4、有“mt”的为“threading-multi”版本,没有的则是“threading-single”版本。
boost 库的命名特点:
(1)以“lib”开头的是“link=static”版本(静态链接库版本,没有dll),而直接以“boost”开头的是“link=shared”版本(动态链接库版本,包含lib和dll)。
(2)所有的库都含有"boost"前缀。
(3)紧随其后的是boost库名称(比如date_time库)。
(4)然后是编译器的版本,与库名称之间以"-"而不是下划线"_"分隔(比如 -vc120)。
(5)有“mt”的为“threading=multi”版本,没有的则是“threading=single”版本。
(6)有“s”的为“runtime-link=static”版本,没有的则是“runtime-link=shared”版本。
(7)有“gd”的为debug版本,没有的则是release版本。
(8)所有的库都含有boost库的版本号结尾(比如1_56,其中的"."以下划线"_"代替)
一位在微软做过编译器开发的大牛是这样解释的:
假设一个库A依赖于库B,我们自己的程序client依赖于库A,即:
那么,link指的是client->A,runtime-link指的是A -> B
配置 | 链接过程 | 运行时需要的文件 |
link=static runtime-link=static | client通过A.a (A.lib)静态包含A; A通过B.a (B.lib)静态包含B; 不关 .so .dll的事 | client |
link=static runtime-link=shared | client通过A.a (A.lib)静态包含A; 在运行时,client要动态调用B.so (B.dll) | client B.so (B.dll) |
link=shared runtime-link=shared | client会包含A.a (A.lib); A会包含 B.a (B.lib); 但都只保存动态库的真正实现的stub,运行时通过stub去动态加载 A.so (A.dll), B.so (B.dll) 中的实现 | client A.so (A.dll) B.so (B.dll) |
link=shared runtime-link=static | client会包含A.a (A.lib),但只包含真正实现的stub; A通过B.a (B.lib)静态包含B; 运行时,client会动态调用A.so (A.dll) | client A.so (A.dll) |