首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Linux 上的 IBM 编译器的 xlcpp 工具集构建 Boost 库-2

使用 Linux 上的 IBM 编译器的 xlcpp 工具集构建 Boost 库-2

指定要用于 Boost 构建流程的编译器
无需修改 xlcpp.jamuser_config.jam 文件,b2 将在 $PATH 上使用 xlC 编译器,使用 xlcpp 工具集构建 Boost 库。您可以在清单 3 中了解在 $PATH 上设置 xlC 编译器的详细信息。
用户可修改配置文件来灵活地指定编译器作为构建参数。有关细节将在下一篇文章中讨论。
Boost 构建引擎 b2 接受 3 种命令行标志:选项、属性和目标。可以按任意顺序指定命令行标志,并按以下方式区分它们。
  • 选项(规定构建引擎 b2 的行为)以一个或两个连字符开头,比如 –a、--build-dir。
  • 属性(指定要构建的库的细节)是采用了 feature=value 格式的标志,比如 link=static。
  • 目标是所有不是选项也不是属性的标志。目标标志向构建引擎告知要构建的目标。
主要命令行选项
表 2 列出了一些常用于构建 Boost 库的最重要的选项。对于支持的选项的完整列表,请参阅  发布的 。
表 2:重要选项
选项描述-a 重新构建所有内容,即使目标已存在 -n 不运行命令,而是将它们打印到标准输出 -d0 启用调试级别 0(也就是说,不会显示信息性消息) -dN 启用从 1 到 N 的累积调试级别。–d1 是默认值,它显示了在运行调试时为构建每个目标而采取的动作的信息 -d+N 仅启用调试级别 N -jN 并行运行最多 N 个命令 -s var=value 使用指定的 value 覆盖变量 var 的值(从环境中导入)--debug-configuration 显示了加载 Boost.Build 和工具集文件的过程的调试信息 --clean 清理当前目录和任何子项目中的所有目标 --help 显示帮助信息
常用属性
表 3 中列出了最常用的属性,用户可能经常在命令行上以 feature=value 形式指定这些属性。对于可接受的属性的完整列表,请参阅  发表的  节。
表 3:“特性=值” 形式的常用属性
特性可接受的值描述variantdebug、 release 确定构建版本将是调试构建还是发布构建 linkshared、 static 确定创建的库将是共享对象还是静态对象 threadingsingle、 multiple 如果指定了 multiple,则生成的库是线程安全的。这需要在源代码中提供适当的支持。 cxxflags(任意字符串) 指定要传递给 C++ 编译器的选项集 cflags(任意字符串) 指定要传递给 C 编译器的选项集 linkflags(任意字符串) 指定要传递给链接器的选项集
对于一些特性,比如 link 和 threading,可在命令行中为它们指定多个值。在这种情况下,目标将被构建多次,为特性的每个指定值都构建一次。例如,如果命令行属性是 link=static link=shared threading=single threading=multi 或等效的 link=static,shared threading=single,multi,将总共执行 4 次构建。
表 4:具有多个指定值的组合属性
组合属性BuildLinkThreading


link=static,shared threading=single,multi1staticsingle2staticmultiple3sharedsingle4sharedmultiple构建和安装 Boost
准备好 Boost 源代码并设置环境后,用户就可以开始从 mybuild 目录构建和安装 Boost 库。请参阅清单 7 了解有关的命令。
清单 7:构建和安装 Boost 库
1
2
3
4
5
6
7
8
9
10
11
12
13
$ mkdir mybuild
$ cd mybuild
$ BOOST_ROOT=<path>/boost_1_59_0
$ export BOOST_ROOT
$ mkdir <path>/boost_build
$ BOOST_INSTALL=<path>/boost_install
$ export BOOST_ INSTALL
$ BOOST_BUILD=<path>/boost_build
$ export BOOST_BUILD

$ cd $BOOST_ROOT
$ ./b2 install --prefix=$BOOST_ INSTALL --build-dir=$BOOST_BUILD -j8
-l1200 toolset=xlcpp variant=release target-os=linux -s OS=LINUX -d2 -a




命令 b2 install 执行一次配置检查,然后根据检查结果来构建和安装所有库。
与架构独立的文件(例如头文件)将安装在值 --prefix 指定的位置中由 --includedir 指定的子目录。如果没有提供相关选项,则使用默认值。
表 5:安装独立于架构的文件的选项
选项默认值描述--prefix=<PREFIX>/usr/local 指定安装独立于架构的文件的位置 --includedir=<HDRDIR><PREFIX>/include 指定安装头文件的位置
在清单 7 中所示的例子中,--prefix 值是显式指定的位置 <path>/boost_install。另外,因为命令行上缺少 --includedir,所以会使用它的默认值 <PREFIX>/include。因此,在这种情况下,Boost 的头文件将被复制到 <path>/boost_install/include。
图 2:包含在 <path>/boost_install/include 中的头文件
将根据相应的 JAM 配置文件来创建编译的库。然后将它们复制到值 --exec-prefix 规定的位置中由 --libdir 指定的子目录。如果没有这些选项,则使用默认值。
表 6:安装独立于架构的文件的选项
选项默认值描述--exec-prefix=<EPREFIX><PREFIX> 指定安装独立于架构的文件的位置 --libdir=<DIR><EPREFIX>/lib 指定安装库文件的位置
在清单 7 中所示的例子中,--exec-prefix 的值是默认值 <PREFIX>,即 <path>/boost_install,因为未显式指定该值。类似地,由于命令行上还缺少 --libdir,所以将使用它的默认值 <EPREFIX>/lib。相应地,这些库将安装在 <path>/boost_install/lib 中。
图 3:安装在 <path>/boost_install/lib 中的库

--build-dir=$BOOST_BUILD 属性规定必须在 $BOOST_BUILD 目录而不是分布树中执行构建。这在分布树位于只读位置时必不可少。
–j8 选项指定最多可并行运行 8 个命令。–l1200 选项指示 Boost 构建引擎将在 1200 秒后超时。–d2 选项启用调试级别 2,该级别会向标准输出显示运行的命令的所有动作文本。toolset=xlcpp 属性告知构建引擎,将使用 IBM XL 编译器进行编译。target-os 属性告诉构建引擎为 Linux 操作系统创建库。
因为绝大部分 Boost 库都只是头文件,所以在未优化的情况下,Boost 库的构建和安装相对较快。在更高的优化级别上,比如 –O2 和 –qipa(过程间分析优化),编译 Boost 库可能会花更多的时间。
要向编译器传递更多选项,可以使用 cxxflags、cflags 或 linkflags。例如,可以按照清单 8 中所示的方式,将 -qnoxlcompatmacros 选项传递给编译器。下一篇介绍 Boost 配置的进一步优化的文章将会讨论将额外选项传递给编译器的其他方式。
清单 8:将额外的选项传递给编译器
1
2
3
$ ./b2 install cxxflags="-qnoxlcompatmacros" cflags="-qnoxlcompatmacros"
--prefix=$BOOST_ INSTALL --build-dir=$BOOST_BUILD -j8 -l1200 toolset=xlcpp
variant=release target-os=linux -s OS=LINUX -d2 -a




显示要构建到 Boost 版本中的库名称
Boost 版本中的库数量在不同版本中可能有所不同。要显示所有要构建到某个 Boost 版本中的库的准确名称,可以使用 --show-libraries 选项调用 b2。
清单 9:显示要构建的库
1
2
3
4
5
6
7
$ BOOST_ROOT/b2 --show-libraries
The following libraries require building:
    - atomic
    - chrono
    - container
    - context
< … >




使用此选项获取的库的准确名称将与其他选项一起使用,比如 --with-<library> 和 --without-<library>。这些选项将在下一节介绍。
仅构建和安装特定的库
仅使用 install 命令调用时,Boost 构建引擎 b2 将构建和安装项目中包含的所有库。要规定只构建某些库,用户可以使用 --with-<library> 命令行选项。通过此选项调用时,Boost 构建引擎 b2 仍将安装所有头文件,但只会构建以下两组中的库:
  • 显式库(使用一个选项显式指定的库)
  • 隐式库(构建显式库所需的库)
例如,以下调用规定将只构建 chrono 库。尽管未指定 system 库,但仍然构建了它,因为显式指定的库 chrono 需要它。
清单 10:仅构建 chrono 库
1
2
$BOOST_ROOT/bjam install --with-chrono -j4 -l1200 toolset=xlcpp
variant=release target-os=linux -s OS=LINUX -d2 -a




图 4 表明显式库 chrono 和隐式库 system, 均已构建。
图 4:同时构建了显式和隐式库
排除特定的库
不需要某些库时,用户可以使用选项 --without-<library> 告知 b2 这一事实。但是请注意,如果其他某个库需要指定的库,仍会构建它。例如,因为 chrono 库需要 system 库,所以即使没有显式提到要构建 system 库,仍会创建它作为 chrono 库的隐式库。
清单 11:仅排除 system 库
1
2
$BOOST_ROOT/bjam install --without-system -j4 -l1200 toolset=xlcpp
variant=release target-os=linux -s OS=LINUX -d2 -a




结束语从 1.59.0 版开始,Boost 支持用于 IBM XL 编译器的 xlcpp 工具集。使用 b2/bjam 和 xlcpp 工具集构建 Boost 库很简单,尤其是在项目允许使用补丁文件来修改 Boost 头文件和 JAM 配置文件时。在不适合使用补丁文件的情况下,或者在不容易获取补丁文件时,需要完成更多工作才能构建 Boost 库。
本文介绍了在正确修补 Boost 头文件和 JAM 配置文件后,从 Boost 源代码构建和安装 Boost 库的基本过程。后续的一篇文章将会进一步介绍如何自定义 Boost 配置来轻松构建 Boost 库,甚至在不允许使用补丁文件时也能实现此操作。
返回列表