3

我尝试使用 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)

项目-config.jam

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

平台

  • 视窗 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%
4

5 回答 5

3

This is a known issue for building Boost >~1.51 with MinGW. At the moment, building Boost with MinGW is broken because Boost has a dependency on MASM (in your case ml64) when building Boost::Context for Windows, even with MinGW.

As a bodge you can get MASM from the Microsoft Website: http://www.microsoft.com/en-gb/download/details.aspx?id=12654 for a 32-bit version, or else the Windows Driver Kit for the 64-bit version: http://msdn.microsoft.com/en-us/windows/hardware/hh852365.aspx

You can use the patch provided on the Boost bug tracker here: https://svn.boost.org/trac/boost/ticket/7262 though to make Boost::Context compile with just MinGW, thus re-enabling cross-compilation of Boost. You can also read the responses by Boost's Olli on the subject and his response to the subject. Don't expect anything to be fixed in Boost for a while at least!

于 2013-10-15T16:12:51.960 回答
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.

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

于 2014-11-11T20:39:34.547 回答
0

根据Boost 的要求,可以在微软的 Windows Driver Kit (WDK) 中找到 MASM64。

我从Microsoft 下载中心下载了 WDK 7 ,安装后,我ml64.exebin\x86\amd64. 这样,我就能够成功编译 Boost 1.53.0。

于 2013-03-29T17:38:47.080 回答
0

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

import option ;
using msvc ; 

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

bjam --clean

这应该从 msvc build 中清除工件,然后您可以发出并且事情应该没问题

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

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

于 2013-06-03T04:16:24.883 回答
0

可能有点晚了,但我设法在 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=共享线程=多

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

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

于 2014-07-25T07:59:05.860 回答