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

C++ Build Environment using MinGW-w64 and Boost.Build

本文关键字:C++ 构建 环境 Build MinGW-w64 Boost 使用      更新时间:2023-10-16

我目前正在将我的一个项目移植到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

由于32位和64位工具链位于不同的目录中,MinGW-w64使这一点变得"有问题"。(分别为C:\MinGW32和C:\MinGW64)。

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

编辑:

如果有帮助的话,我会在"个人构建"文件夹中使用MinGW-w64网站上的ruenvb 4.6.3-1构建(我特别使用这些构建,因为我希望尝试在Clang下解析而不是编译我的代码)。

编辑:

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

Yo可以通过添加工具集需求(使用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编译器。

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

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

使用gcc:[version]:[c++-comple命令]:[compiler选项];

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

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

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