5

使用 构建 Boost 二进制库时bjam,可以通过对选项使用某些值来指定要使用的编译器,而无需指定特定的编译器版本。--toolset=例如:

bjam --with-serialization --toolset=msvc

工具集值 msvc告诉您在bjam系统中搜索某个版本的 Microsoft Visual C++,然后使用它来构建 Boost.Serialization 库的许多变体。生成的库将包含一个标签,指示实际使用了哪个工具集。例如,上面的命令会创建如下文件:

libboost_serialization-vc100-mt-s-1_44.lib
libboost_serialization-vc100-mt-sgd-1_44.lib
...

其中文件名中的字符串vc100是一个工具集标记,指示已找到Microsoft Visual C++ 2010编译器版本并用于构建库。[有关 Boost 库文件命名约定的更多详细信息,请参见此处。]

也可以使用选项的某些其他值来指定编译器的特定--toolset=版本。例如:

bjam --with-serialization --toolset=msvc-9.0

告诉bjam我,即使我的系统上可能有多个编译器,我希望它专门使用Microsoft Visual C++ 2008。生成的库包含标记字符串vc90以指示使用Microsoft Visual C++ 2008构建它们。

Boost 文档对于 Mac 上较新的编译器似乎有点过时(例如,如何区分 GCC、LLVM-GCC 和 LLVM?)

我的问题是,Mac 上 Xcode 3 和 Xcode 4 中特定编译器版本bjam --toolset=的其他一些值及其对应的标签是什么(不是一般的编译器名称值,如)?这些记录在任何地方吗?即使 Boost 还不支持构建具有某些版本的 Boost 库,是否已经指定了 和 标记值?darwintoolset

请帮助替换???此表中的 s:

TOOL AND VERSION               --toolset=     TAG
======================================================
Microsoft Visual C++ 2008      msvc-9.0       vc90
Microsoft Visual C++ 2010      msvc-10.0      vc100
Apple (1) GCC 4.0 (2)            ???          xgcc40
Apple GCC 4.2                    ???          xgcc42
Apple LLVM GCC 4.2               ???           ???
Apple LLVM compiler 1.5 (2)      ???           ???
Apple LLVM compiler 2.0 (3)      ???           ???

(1) Apple 生产自己的 GCC 和 LLVM 编译器版本,以添加 Apple 特定的扩展和行为。

(2) 仅在 Xcode 3 中可用。

(3) 仅在 Xcode 4 中可用。

4

1 回答 1

7

从指定的工具集到标记的基本部分有直接映射。因此,对于您指定的使用darwin.jam工具集的任何 Apple Xcode 编译器,标记的开头将始终是xgcc(对于 Xcode GCC)。第二部分,即编译器的版本号,通常是从编译器本身自动发现的。darwin.jam工具集代码使用该选项-dumnpversion来发现该版本是什么(参见darwin.jam第 123 行)。所以有几点:

  1. 对于 Xcode,它始终是toolset=darwin默认的g++.
  2. 对于其他非默认版本,您必须设置site-config.jamuser-config.jam告诉 Boost Build 在哪里以及您拥有哪些编译器(请参阅BB 配置文档)。
  3. toolset=darwin-<some_version>匹配您在配置中指定的内容。
  4. darwin.jam工具集支持根据您要构建的内容智能选择编译器,使其更容易一些。

例如,我在 iOS 开发中使用如下内容:

using darwin : : /Xcode-path/usr/bin/g++-4.0 ;
using darwin : : /Xcode-path/usr/bin/g++-4.2 ;
using darwin : 4.2~iphone
:   /Xcode-path/Platforms/iPhoneOS.platform/Developer/usr/bin/g++-4.2 -arch armv6
:   <striper>
:   <architecture>arm <target-os>iphone
;
using darwin : 4.2~iphonesim
:   /Xcode-path/Platforms/iPhoneSimulator.platform/Developer/usr/bin/g++-4.2
:   <striper>
:   <architecture>x86 <target-os>iphone
;

为此,我可以:

  1. bjam toolset=darwin-4.0-- 对于使用 GCC 4.0 的常规 OSX 构建。这导致了标签xgcc-42
  2. bjam toolset=darwin-4.2-- 对于 OSX 和 GCC 4.2 也是如此。我会得到一个标签xgcc-42
  3. bjam toolset-darwin architecture=arm target-os=iphone-- 使用 GCC 4.2 构建 iPhone 设备。标签最终也是xgcc42碰撞。但是我们可以在这些标签中解释多少是有限度的。这通常不是问题,因为无论如何都要跨平台隔离构建的结果。

您可以通过添加到配置中来设置使用 LLVM 编译器之一:

using darwin : 4.2~llvm~gcc : /Xcode-path/user/bin/llvm-g++ ;

并调用bjam toolset=darwin-4.2~llvm~gcc. 不幸的是,标签也是xgcc-4.2(同样,它基于 using darwin.jam)。因此,您需要将生成的库与其他 GCC 构建分开。

同样不幸的是,除了在代码中(参见 BB common.jam #801 到 #841 行)之外,没有记录将使用的工具集映射到标记值的位置。

于 2010-09-07T20:43:38.783 回答