7

我目前正在将我的一个项目移植到 GCC,并且我正在使用 MinGW-w64 项目来完成此任务,因为我需要 x64 和 x86 支持。

不过,我在设置构建环境时遇到了问题。我的项目目前使用 Boost C++ 库,为了简化构建过程,我也在我的项目中使用了 Boost.Build(因为它使集成变得简单)。

在 MSVC 下这很好,因为我可以从命令行执行以下操作:

b2 toolset=msvc address-model=32 # compile as 32-bit
b2 toolset=msvc address-model=64 # compile as 64-bit

MinGW-w64 使这个“有问题”,因为 32 位和 64 位工具链位于不同的目录中。(分别为 C:\MinGW32 和 C:\MinGW64)。

是否可以设置 Boost.Build 以根据地址模型标志选择正确的工具链?如果没有,我的下一个最佳选择是什么?

编辑:

如果有帮助,我将使用 MinGW-w64 网站的“个人构建”文件夹中的 rubenvb 4.6.3-1 构建(我特别使用这些构建,因为我希望尝试让我的代码解析 - 但不编译- 在 Clang 下)。

编辑:

我刚刚想到的一个解决方案是在编译之前“手动”设置 PATH 以指向正确的工具链,但是这给我的构建过程增加了一层额外的复杂性,我想避免这种复杂性。理想情况下,我希望它像 MSVC 一样简单,尽管我知道这可能是不可能的。在最坏的情况下,我假设我刚才的建议会起作用,我只需要在调用 Boost.Build 之前添加脚本以正确设置 PATH。这将意味着硬编码一条路径,我不想这样做......

4

3 回答 3

5

toolset.add-requirements通过添加工具集要求(使用规则),您可以根据一组匹配属性选择任何 Boost.Build 工具集。在一些工具集中有对此的内置支持,比如darwin.jam(Xcode),但不幸的是我们还没有将它添加到 gcc 工具集中。但是您可以user-config.jam在声明工具集时使用相同的最少代码。对于您的情况,它可能如下所示:

import toolset ;

using gcc : gcc-4.6.3~32 : /path/to/32bit/mingw/gcc ;
using gcc : gcc-4.6.3~64 : /path/to/64bit/mingw/gcc ;

# Add a global target requirements to "choose" the toolset based on the address model.
toolset.add-requirements <toolset>gcc-4.6.3~32:<address-model>32 ;
toolset.add-requirements <toolset>gcc-4.6.3~64:<address-model>64 ;

这具有将给定的条件要求添加到所有目标的效果。这具有根据需要为特定声明的工具集选择特定目标的效果。

..忘了提..即使这是创建两个不同的工具集声明,默认值仍然是动态选择的。一个人会使用通常的命令行:

b2 toolset=gcc address-model=64

使用 64 位 mingw 编译器。

于 2012-01-16T14:08:38.723 回答
3

由于 MinGW 二进制文件具有不同的名称,您应该能够在路径中包含展位目录,然后在 jam 配置文件中添加两个不同的工具集,您可以在其中指定二进制文件的确切名称(不包括路径)。

在配置文件中根据格式添加以下内容

使用 gcc:[版本]:[c++-compile-command]:[编译器选项];

using gcc : 32 : mingw-w32-1.0-bin_i686-mingw ;
using gcc : 64 : mingw-w64-1.0-bin_i686-mingw ;

然后您应该可以像这样调用 b2 :

b2 toolset=gcc-32
bt toolset=gcc-64
于 2012-01-11T09:58:29.613 回答
0

MinGW-w64 可以构建 32 位和 64 位二进制文​​件。

我将 tdm-mingw 与 mingw64 toolchan 一起使用,并且仅将-m32或传递-m64给链接器/编译器以选择版本。在默认情况下,构建 64 位二进制文​​件。

于 2012-01-11T11:26:43.357 回答