使用没有MASK的MinGW W64构建Boost

时间:2012-12-21 08:58:24

标签: windows boost mingw masm

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

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

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

我阅读了文档并说:

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

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

项目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%

5 个答案:

答案 0 :(得分:3)

这是使用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位版本,或者使用64位版本的Windows驱动程序工具包:http://msdn.microsoft.com/en-us/windows/hardware/hh852365.aspx

你可以在这里使用Boost bug跟踪器上提供的补丁:https://svn.boost.org/trac/boost/ticket/7262虽然只使用MinGW进行Boost :: Context编译,从而重新启用Boost的交叉编译。您还可以阅读Boost的Olli关于该主题的回复以及他对该主题的回应。不要指望至少在Boost中修复任何东西!

答案 1 :(得分:2)

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

如果使用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。

希望有人在谷歌上搜索我一整天用Google搜索的相同条款会觉得这很有帮助。

答案 2 :(得分:0)

根据Boost's requirements,您可以在Microsoft的Windows驱动程序工具包(WDK)中找到MASM64。

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

答案 3 :(得分:0)

(如果这仍然相关)当您的构建文件夹中还有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位二进制文​​件......

答案 4 :(得分: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 \ 86 \ AMD64; C:\的Windows \ WINDDK \ 7600.16385.1 \ BIN \ 86
  4. 以管理员身份打开cmd.exe并启动bash
  5. 在助推器的父目录中,运行
    git clone --recursive https://github.com/boostorg/boost.git boost> clone.log
  6. 退出bash,转到目录提升并运行: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
  8. 如果没有明确地将ML(64)目录添加到路径中,我仍然会得到关于ML的错误。

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