库可以是 静态的,这意味着它们被包含在使用它们的执行文件中,也可以是 共享的(也称为 动态),它们只从可执行文件中引用,并且必须在运行时可用。 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
的依赖项,导致 app
与 core
和 utils
链接。
(非 Unix 系统的说明)。通常,共享库必须安装到动态链接器搜索路径中的目录中。否则,使用共享库的应用程序无法启动。在 Windows 上,动态链接器的搜索路径由 PATH
环境变量给出。当你使用 Boost.Build 测试工具时,这种限制会解除——在运行可执行文件之前,PATH
变量会自动调整。