Boost C++ Libraries

PrevUpHomeNext

静态和共享库

库可以是 静态的,这意味着它们被包含在使用它们的执行文件中,也可以是 共享的(也称为 动态),它们只从可执行文件中引用,并且必须在运行时可用。 Boost.Build 可以创建和使用这两种类型的库。

lib 目标生成的库类型由 link 特性的值决定。默认值为 shared,要构建静态库,则该值应为 static。你可以通过命令行请求静态构建

b2 link=static

或者在库的依赖项中

lib l : l.cpp : <link>static ;

我们也可以使用 <link> 属性在每个目标的基础上表达链接要求。例如,如果某个特定的可执行文件只能使用静态版本的库才能正确构建,我们可以将该可执行文件的 目标引用 限定为库,如下所示

exe important : main.cpp helpers/<link>static ;

无论在 b2 命令行上指定了哪些参数,important 只会与 helpers 的静态版本链接。

在目标引用中指定属性特别有用,如果你使用的是其他项目(你无法更改的项目)中定义的库,但你仍然希望在所有情况下都对该库进行静态(或动态)链接。如果该库被许多目标使用,你 可以 在所有地方使用目标引用

exe e1 : e1.cpp /other_project//bar/<link>static ;
exe e10 : e10.cpp /other_project//bar/<link>static ;

但这远非方便。更好的方法是引入间接级别。创建一个本地 别名 目标,它引用 foo 的静态(或动态)版本

alias foo : /other_project//bar/<link>static ;
exe e1 : e1.cpp foo ;
exe e10 : e10.cpp foo ;

别名 规则专门用于重命名对目标的引用,并可能更改属性。

提示

当一个库使用另一个库时,你将第二个库放在第一个库的源列表中。例如

lib utils : utils.cpp /boost/filesystem//fs ;
lib core : core.cpp utils ;
exe app : app.cpp core ;

无论使用哪种链接类型,这都适用。当 core 构建为共享库时,它被直接链接到 utils 中。静态库无法链接到其他库,因此当 core 构建为静态库时,它对 utils 的依赖关系会传递给 core 的依赖项,导致 appcoreutils 链接。

注意

(非 Unix 系统的说明)。通常,共享库必须安装到动态链接器搜索路径中的目录中。否则,使用共享库的应用程序无法启动。在 Windows 上,动态链接器的搜索路径由 PATH 环境变量给出。当你使用 Boost.Build 测试工具时,这种限制会解除——在运行可执行文件之前,PATH 变量会自动调整。


PrevUpHomeNext