构建 boost 1.65.0:找不到 vcvarsall.bat

Posted

技术标签:

【中文标题】构建 boost 1.65.0:找不到 vcvarsall.bat【英文标题】:Building boost 1.65.0: vcvarsall.bat not found 【发布时间】:2017-08-23 11:40:17 【问题描述】:

我尝试使用 Visual Studio 2017 x64 和 Windows 10 构建 boost 1.65.0。

This 是我的 power shell 构建脚本的样子:

. ".\Invoke-CmdScript.ps1"

# We expect PowerShell Version 5
if(-Not $PSVersionTable.PSVersion.Major -eq 5) 
    Write-Host "Expecting PowerShell Version 5"
    return


# Now download boost 1.65.0
Invoke-WebRequest http://dl.bintray.com/boostorg/release/1.65.0/source/boost_1_65_0.zip -OutFile C:\thirdparty\vs2017\x64\boost_1_65_0.zip

# Check file hash
$value = Get-FileHash C:\thirdparty\vs2017\x64\boost_1_65_0.zip -Algorithm SHA256

if($value.Hash -ne "f3f5c37be45eb6516c95cd147d8aa4abb9b52121fc3eccc1fc65c4af0cf48592") 
    Write-Host "boost archive seems to be corrupted"
    return


# Extract file
$strFileName="$env:ProgramFiles\7-Zip\7z.exe"
If (Test-Path $strFileName)
    # Use 7-zip
    if (-not (test-path "$env:ProgramFiles\7-Zip\7z.exe")) throw "$env:ProgramFiles\7-Zip\7z.exe needed" 
    set-alias sz "$env:ProgramFiles\7-Zip\7z.exe"  
    sz x C:\thirdparty\vs2017\x64\boost_1_65_0.zip -oC:\thirdparty\vs2017\x64
 Else 
    # use slow Windows stuff
    Expand-Archive C:\thirdparty\vs2017\x64\boost_1_65_0.zip -DestinationPath C:\thirdparty\vs2017\x64\boost_1_65_0


# Removed downloaded zip archive
Remove-Item C:\thirdparty\vs2017\x64\boost_1_65_0.zip

# Setup VS2017 x64 environment
Invoke-CmdScript -script "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" -parameters amd64

# Build
cd C:\thirdparty\vs2017\x64\boost_1_65_0
Invoke-CmdScript -script "bootstrap.bat"

$cpuInfo = Get-CimInstance -ClassName 'Win32_Processor' `
    | Select-Object -Property 'DeviceID', 'Name', 'NumberOfCores', 'NumberOfLogicalProcessors';

Write-Host $cpuInfo.NumberOfLogicalProcessors

.\b2.exe --toolset=msvc-14.1 address-model=64 --build-type=complete stage -j $cpuInfo.NumberOfLogicalProcessors

归结为:很简单:

    bootstrap.bat b2.exe --toolset=msvc-14.1 address-model=64 --build-type=complete stage –j 8

执行 bootstrap.bat 似乎有效。但是 b2 会产生一些错误——找不到 vcvarsall.bat:

尽管如此,似乎一切都很好:

忽略这些错误消息是否安全? 有人可以重现这些错误吗?

【问题讨论】:

注意:b2 的正确工具集是 toolset=msvc-14.1 不是 toolset=msvc-15.0。如果您被我的旧答案 here 误导,我很抱歉 好的,很好,解决了这个问题 - 你能从你的评论中回答,以便我接受你的回答吗? 我很高兴它对你有用 @Vertexwahn,我已经发布了 MSVC 和 MinGw 的完整答案,谢谢。 【参考方案1】:

要更新(和更正!)我之前关于构建提升的答案,这是我在 Windows 上构建 boost 的最新笔记,适用于 Visual StudioMinGw

Windows 不直接支持 boost,所以你可以下载它并放在任何你想要的地方。 boost 用户指南建议创建一个带有 boost 位置的BOOST_ROOT环境变量。

为 Visual Studio 构建

在 Visual Studio 工具命令提示符中:

cd boost_1_xx_0
call bootstrap.bat

对于 64 位静态库(推荐用于 Windows):

b2 -j8 toolset=msvc address-model=64 link=static threading=multi runtime-link=shared --build-type=complete stage
2>&1 | tee msvc_static_build.txt

注意:boost thread 库必须使用动态链接构建,请参阅:https://studiofreya.com/2015/05/20/the-simplest-way-of-building-boost-1-58-for-32-bit-and-64-bit-architectures-with-visual-studio/

对于 64 位动态库(仅限线程):

b2 -j8 toolset=msvc address-model=64 link=shared threading=multi runtime-link=shared --with-thread --build-type=minimal stage
2>&1 | tee msvc_thread_build.txt

如果您安装了多个版本的Visual Studio 并且想要为特定版本构建,请使用:

Visual Studio 2017: toolset=msvc-14.1 Visual Studio 2015: toolset=msvc-14.0 Visual Studio 2013: toolset=msvc-12.0 Visual Studio 2012: toolset=msvc-11.0 Visual Studio 2010: toolset=msvc-10.0

注意:当我为 Visual Studio 2017 为 64 位二进制文​​件构建 boost 1.65.0 时,b2 输出“building 32 bit: true”,但它构建了 64 位库...

另请注意:在 Visual Studio 2017 中编译 boost 1.65.0 包含文件时,您可能会看到警告:

未知的编译器版本 - 请运行配置测试并报告结果

这是因为Visual Studio 2017 的最新版本将_MSC_VER 定义为1911,而boost\config\compilier\visualc.hpp 包含:

// last known and checked version is 19.10.25017 (VC++ 2017):
#if (_MSC_VER > 1910)
#  if defined(BOOST_ASSERT_CONFIG)
#     error "Unknown compiler version - please run the configure tests and report the results"
#  else
#     pragma message("Unknown compiler version - please run the configure tests and report the results")
#  endif
#endif

要删除警告,请将visualc.hpp 的第 325 行更改为:

#if (_MSC_VER > 1911)

为 MinGw 构建

确保mingwgcc 在路径中,例如:C:\Qt\Tools\mingw491_32\bin

cd boost_1_xx_0
call bootstrap.bat gcc

b2 toolset=gcc link=shared threading=multi --build-type=complete stage
2>&1 | tee mingw_build.txt

注意:对于 1.61 之前的 boost 版本,将 bootstrap.bat gcc 更改为 bootstrap.bat mingw

另请注意:2>&1 | tee name.txt 不是必需的,但保留日志很有用...

【讨论】:

"output "building 32 bit: true", but it build 64 bit libraries..." - 你确定它没有将 32 位库命名为 64 位吗?这并不少见,参见例如***.com/a/69317280/85371 是的@sehe,我确定它们是 64 位库,因为我将它们构建为 64 位 exes。

以上是关于构建 boost 1.65.0:找不到 vcvarsall.bat的主要内容,如果未能解决你的问题,请参考以下文章

找不到 boost::serialization 的成员

QT 和 Boost:找不到 -llibboost_filesystem

使用boost在eclipse中找不到libboost_system.so.1.43.0

构建 boost.build 引擎

如何在 Eclipse 中构建代码之前运行 vcvars32.bat?

Visual Studio 2019:使用 vcvars64.bat 从命令行构建 C++ 不再起作用