【问题标题】:Building Boost with MinGW64 without MASM使用不带 MASK 的 MinGW W64 构建 Boost
【发布时间】:2012-12-08 20:23:20
【问题描述】:

我尝试使用 MinGW64 编译器为本地 64 位构建 Boost 库,但遇到了一些失败。任何指针表示赞赏。谢谢。

我得到了 64 位编译的 bjam.exe (b2.exe)(带有警告),我用它来构建 Boost。构建 Boost.Context 时出现以下错误。 (我为可重复构建批量编写了命令)。我错过了什么?

  • 命令:b2.exe install --prefix=%~dp0\bld\Boost.Build
  • 错误:“ml64”未被识别为内部或外部命令、可运行程序或批处理文件。

我阅读了文档,上面写着:

Boost.Context 必须针对特定的编译器和 CPU 架构构建。 Boost.Context 包含汇编代码,因此,支持的 POSIX 系统需要 GNU AS,Windows 系统需要 MASM。

那么,是否可以告诉 bjam 使用我的 MinGW 安装中包含的 as.exe? (因为我有多个MinGW,所以位置不是标准的C:\MinGW\bin)

project-config.jam

import option ;
using gcc ; 
option.set keep-going : false ; 

平台

  • Windows 7 x64
  • Boost 1.52.0(来自 sourceforge)
  • MinGW 4.7.2 (rubenvb x64)
  • 没有安装 MSVC(没有在我的机器上安装/找到 ml64.exe)
  • 编辑安装WDK时出现问题

构建BJam时的警告,我觉得可以忽略

function.c: In function 'check_alignment':
function.c:222:5: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]

整批

SET OPATH=%PATH%
SET BOOST_VER=boost_1_52_0
SET "PATH_ZIP=C:\Program Files\7-zip"
SET "PATH_MINGW=C:\MinGW\rubenvb-4.7.2-64"
SET "PATH_SRC=%~dp0\%BOOST_VER%"
SET "PATH_BJAM=%PATH_SRC%\tools\build\v2\engine"

TITLE Extracting Packages ...
IF NOT EXIST "%PATH_SRC%.7z" GOTO :err_nozip
RD /S /Q "%PATH_SRC%"
"%PATH_ZIP%"\7z x "%PATH_SRC%.7z"

TITLE Building BJam ...
PUSHD "%PATH_BJAM%"
SET "PATH=%PATH_MINGW%\bin"
SET "BOOST_JAM_TOOLSET_ROOT=%PATH_MINGW%\"
CALL build.bat mingw --show-locate-target
SET PATH=%OPATH%
COPY "bin.ntx86_64\b2.exe" "%PATH_SRC%\" > nul
COPY "bin.ntx86_64\bjam.exe" "%PATH_SRC%\" > nul
POPD

TITLE Installing Boost Build...
PUSHD "%PATH_SRC%"
ECHO import option ; > project-config.jam
ECHO. >> project-config.jam
ECHO using gcc ; >> project-config.jam
ECHO. >> project-config.jam
ECHO option.set keep-going : false ; >> project-config.jam
ECHO. >> project-config.jam
b2.exe install --prefix=%~dp0\bld\Boost.Build
POPD

SET PATH=%OPATH%

【问题讨论】:

标签: windows boost mingw masm


【解决方案1】:

这是使用 MinGW 构建 Boost >~1.51 的已知问题。目前,使用 MinGW 构建 Boost 已被破坏,因为 Boost 在为 Windows 构建 Boost::Context 时依赖于 MASM(在您的情况下为 ml64),即使使用 MinGW 也是如此。

您可以从 Microsoft 网站获取 MASM:http://www.microsoft.com/en-gb/download/details.aspx?id=12654 用于 32 位版本,或者 Windows 驱动程序工具包用于 64 位版本:http://msdn.microsoft.com/en-us/windows/hardware/hh852365.aspx

您可以在此处使用 Boost 错误跟踪器上提供的补丁:https://svn.boost.org/trac/boost/ticket/7262 尽管只使用 MinGW 编译 Boost::Context,从而重新启用 Boost 的交叉编译。您还可以阅读 Boost 的 Olli 对该主题的回复以及他对该主题的回复。至少在一段时间内不要指望 Boost 会修复任何问题!

【讨论】:

  • 我先尝试了补丁,对我不起作用。安装 Windows Driver Kit 并将 ml64.exe 放入我的 %PATH% 后,可以构建 Boost::Context。
【解决方案2】:

为了谷歌的利益,在这里发布这个答案,因为我整天都在努力解决这个问题,终于找到了解决方案。

如果使用 MASM 6 构建,Boost 上下文将无法在 MinGW 下链接,因为它会生成 EXPORT 符号。

即使库已正确链接,这也会显示为 undefined reference to `make_fcontext'

生成的库上的 Objdump 给出make_i386_ms_pe_masm.o: File format not recognized

解决方案是确保您使用的是 MASM 8。

您可以在http://www.microsoft.com/en-us/download/confirmation.aspx?id=12654 下载它 - 安装程序会抱怨需要安装 VC,但您可以通过使用 WinRAR 等工具提取安装程序的内容来绕过它;解压 setup.exe 并再次解压得到 .cab,第三次解压并将生成的二进制文件重命名为 ml.exe。

然后用bjam --toolset=gcc --with-context -a stage重建Boost。

希望有人在谷歌上搜索我整天搜索的相同术语会发现这很有帮助。

【讨论】:

    【解决方案3】:

    根据Boost's requirements,您可以在微软的Windows Driver Kit (WDK) 中找到MASM64。

    我从Microsoft Download Center下载了WDK 7,安装后在bin\x86\amd64找到ml64.exe。这样,我就能够成功编译 Boost 1.53.0。

    【讨论】:

    • 我下载了 WDK,但在安装工具时遇到问题,它只是抛出错误并在未完成的情况下终止。所以我必须坚持使用 MinGW 工具链
    • @YamHon.CHAN 这对我来说真的很顺利。也许您可以针对遇到的问题提出另一个问题。
    • 感谢您的建议,我将为该问题打开一个新问题,但目前,我必须坚持使用 MinGW 工具链
    • 嗨——正如我在上面的回答中所解释的,我必须将 ml.exe 和 ml64.exe 的目录都添加到路径中,以便在仅安装 WDK(无 Visual)的情况下安装 boost。希望对你有用。
    【解决方案4】:

    (如果这仍然相关)当您的构建文件夹中有 msvc 工件时会发生这种情况。我假设您的 project-config.jam 最初是

    import option ;
    using msvc ; 
    

    你已经为 msvc 构建然后更改为“使用 gcc”在这种情况下,你需要先发出以下命令

    bjam --clean
    

    这应该从 msvc 构建中清除工件,然后您可以发布,事情应该没问题

    bjam toolset=gcc variant=..... and so on and on
    

    顺便说一句,我看到你写的是 Windows 7 x64。您的 bjam 命令需要具有 adress-model=64 否则将生成 32 位二进制文​​件...

    【讨论】:

      【解决方案5】:

      可能有点晚了,但我设法在 Windows 7 上使用 MinGW 和 WDK 7 编译了 boost-modular(Git 存储库,因此应该类似于 2014 年 7 月的 1.55)。

      我使用的步骤是

      1. 使用 mingw-get-setup(简单方法)安装 MinGW 和 Msys(bash 等),将 bin/ 添加到路径
      2. 安装 Windows 驱动程序工具包(对于 W7,我使用了 WDK 7) -- GRMWDK_EN_7600_1.ISO
        下载 ISO 映像并使用 WinRAR 提取文件对我有用
        安装程序建议不要安装 DSF,所以跳过它
      3. 将 ML64.exe 和 ML.exe 的目录添加到路径中(都需要 AFAIK)
        C:\Windows\WinDDK\7600.16385.1\bin\x86\amd64;C:\Windows\WinDDK\7600.16385.1\bin\x86
      4. 以管理员身份打开 cmd.exe 并启动 bash
      5. 在 boost 的父目录中运行
        git clone --recursive https://github.com/boostorg/boost.git boost > clone.log
      6. 退出 bash,转到目录 boost 并运行:bootstrap gcc
      7. 如果完成后没有问题(如果找到 ML64.exe),请运行
        b2 -a -d+2 -q --build-type=complete --build-dir=build toolset=gcc link=shared runtime-link=shared threading=multi

      如果没有明确地将 ML(64) 目录添加到路径中,我仍然会收到有关 ML 的错误。

      安装 MASM 与安装 MSVC 不同。我首先尝试使用不同的汇编器,但 boost 与它们的输出不兼容。

      【讨论】:

      • 只是补充一点:1y 后我基本上能够重新执行这些步骤,重新发现路径中步骤 1 的 bin 目录 1 是 64 -bit mingw 编译器 2 运行“bootstrap gcc”后,您需要更改project-config.jam:而不是using msvc ;,它应该在运行最后一个@之前读取using gcc ; 3 987654325@这一行,你需要运行b2 headers来设置一些符号链接——否则上一步找不到一些文件
      • 实际上它不能使用b2 的那些选项进行编译。没有选项(例如,没有动态链接,没有多线程),b2成功完成;有选项它以undefined reference to __imp_ make_fcontextundefined reference to __imp_jump_fcontext 退出 - 不知道如何解决那个......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 2016-11-01
      相关资源
      最近更新 更多