【问题标题】:C++ Build Environment using MinGW-w64 and Boost.Build使用 MinGW-w64 和 Boost.Build 的 C++ 构建环境
【发布时间】:2012-02-05 15:32:59
【问题描述】:

我目前正在将我的一个项目移植到 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。这意味着硬编码一条路径,我不想这样做......

【问题讨论】:

    标签: c++ windows boost mingw boost-build


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      由于 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
      

      【讨论】:

      • 有没有办法在不向工具链添加前缀的情况下做类似的事情?我想使用“默认”工具链名称,并让地址模型标志检测到 32/64 位部分。
      • 例如b2 工具集=gcc 地址模型=32
      • 据我所知,地址模型显然不支持作为 mingw-gcc 的参数。请问为什么在你的情况下使用 address-model=32 更好?
      • 因为我希望能够在我目前使用的 MinGW-w64 发行版以及 TDM-GCC 等替代方案下编译我的项目,它是 multilib,并构建 x86 和来自同一工具链的 x64 二进制文件。所以在那种情况下,我别无选择,只能使用地址模型标志。基本上,我想要一个“统一”的界面,让维护我的构建环境不那么令人头疼。
      • 好的,但是您仍然应该能够在 tdm-gcc 的配置文件中提供地址模型,例如:“使用 gcc : tdm64: tdm-gcc-binary : address-model=64; " “使用 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”时
      【解决方案3】:

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

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

      【讨论】:

      • 不幸的是,并非所有 MinGW-w64 版本都可以做到这一点。正如我的问题中已经说过的,我使用的是 rubenvb 的构建,它们不是 multilib,所以我有两个安装,一个用于 32 位工具链,一个用于 64 位工具链。 64位工具链只能编译64位二进制文​​件,32位工具链只能编译32位二进制文​​件。
      猜你喜欢
      • 2019-02-09
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 2012-01-18
      • 2020-04-28
      相关资源
      最近更新 更多