使用MinGW-w64和Boost.Build的C++构建环境

7

我正在将我的一个项目移植到GCC,因为我需要同时支持x64和x86,所以我使用MinGW-w64项目来实现。

但是,在设置构建环境时,我遇到了问题。我的项目目前使用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,以便根据address-model标志选择正确的工具链?如果不行,我的下一个最佳选择是什么?

编辑:

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

编辑:

我刚想到的一个解决方案是,在编译之前“手动”设置PATH以指向正确的工具链,但这会给我的构建过程增加额外的复杂性,我希望避免这种情况。理想情况下,它应该像对于MSVC一样容易,但我知道这可能不可能。在最坏的情况下,我认为我刚才提出的方法可以解决问题,并且我只需要添加脚本来正确地设置PATH,然后调用Boost.Build。那将意味着硬编码路径,但我不想这样做...

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编译器。

3

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

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

使用gcc:[版本]:[c++编译命令]:[编译器选项];

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

有没有不必向工具链添加前缀的类似方法?我想使用“默认”的工具链名称,并通过地址模型标志检测32/64位部分。 - RaptorFactor
b2 工具集 = gcc 地址模型 = 32 - RaptorFactor
据我所知,address-model显然不支持作为mingw-gcc的参数。请问在您的情况下使用address-model=32有何优势? - Kristofer
因为我希望能够在我目前使用的MinGW-w64发行版以及其他像TDM-GCC这样的多库发行版下编译我的项目,后者可以从同一工具链构建x86和x64二进制文件。因此,在这种情况下,我别无选择,只能使用address-model标志。基本上,我想要一个“统一”的接口,以使维护我的构建环境变得更加轻松。 - RaptorFactor
好的,但是你仍然应该能够在tdm-gcc的配置文件中提供address-model,例如:"using gcc:tdm64:tdm-gcc-binary:address-model=64;" "using gcc:tdm32:tdm-gcc-binary:address-model=32;" 因此,在使用tdm时,您调用"b2 toolset = gcc-tdm64"或"b2 toolset = gcc-tdm32",在使用mingw-w64时,调用"b2 toolset = gcc-32"或"bt toolset = gcc-64"。 - Kristofer

0

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

我使用 tdm-mingw 和 mingw64 工具链,只需将 -m32-m64 传递给链接器/编译器即可选择版本。默认情况下构建 64 位二进制文件。


不幸的是,并非所有的MinGW-w64构建都能做到这一点。正如我在问题中已经说明的那样,我正在使用rubenvb的构建版本,它们不是多库版本,因此我有两个安装版本,一个用于32位工具链,另一个用于64位工具链。64位工具链只能构建64位二进制文件,而32位工具链只能构建32位二进制文件。 - RaptorFactor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接