我尝试使用MinGW64编译器为原生64位构建Boost库,但是遇到了一些失败。任何指针都表示赞赏。感谢。
我得到了用64位编译的bjam.exe(b2.exe)(带警告),我用它来构建Boost。构建Boost.Context时出现以下错误。 (我批量编写了可重复建筑的命令)。我错过了什么?
我阅读了文档并说:
必须为特定的编译器和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 ;
平台
构建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%
答案 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)。
我使用的步骤是
如果没有明确地将ML(64)目录添加到路径中,我仍然会得到关于ML的错误。
安装MASM与安装MSVC不同。我尝试先使用不同的汇编程序,但boost与它们的输出不兼容。