boost库编译安装b2参数link 和 runtime-link,搭配shared 和 static

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值