Visual Studio 2017、Boost和CMake的版本号

27

从Boost邮件列表上了解到,VS2017有以下版本号,这些版本号可能是我们最感兴趣的:

Visual Studio           15.0
cl; C/C++ Compiler      19.10
Platform Toolset:       v141

以下宏已在Visual Studio 2017集成开发环境中定义:
CrtSDKReferenceVersion  14.0
MSBuildToolsVersion     15.0
PlatformToolsetVersion  141
VCToolsVersion          14.10.25017
VisualStudioVersion     15.0

编译期间将定义以下变量:#define

_MSC_VER                1910
_MSC_FULL_VER           191025017

cl.exe 包含在MSVC文件夹中,与VC工具版本配套。完整的x64文件夹路径为

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX64\x64

cl /Bv 命令行中的列表:

Compiler Passes:
 cl.exe:        Version 19.10.25017.0
 c1.dll:        Version 19.10.25017.0
 c1xx.dll:      Version 19.10.25017.0
 c2.dll:        Version 19.10.25017.0
 link.exe:      Version 14.10.25017.0
 mspdb140.dll:  Version 14.10.25017.0
 1033\clui.dll: Version 19.10.25017.0

注意 mspdb140.dlllink.exe 的版本号均为14.10.25017.0。


在这里点击,似乎应该使用msvc: 14.1作为boost的工具集。而这里是另一个答案,其中一些评论谈到了boost编译器的命名。

当我编译时,我会得到带有v141的库名称,例如:boost_atomic-vc141-mt-1_64.lib


但是在CMake中,_Boost_GUESS_COMPILER_PREFIX函数具有以下功能:
if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.10)
  set(_boost_COMPILER "-vc150")
elseif (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19)
  set(_boost_COMPILER "-vc140")

那么应该使用哪个版本?vc141还是vc150v141是否意味着vc141,还是意味着vc150

vc150 对我来说似乎是CMake的_Boost_GUESS_COMPILER_PREFIX的一个bug。您使用的是哪个版本的CMake?VS2017的工具集v141与VS2015的v140是二进制兼容的,而我从未听说过v(c)150。可能,该CMake宏的开发者正在推测和猜测VS2017的工具集。 - Torbjörn
@Torbjörn 同意。有 VC 15.0,但没有 Toolset 15.0(尚未),文件名是指工具集。我正在使用 CMake 3.8.0-rc1。 - wally
如果您使用的是CMake版本<3.8.0(包括RC版本),则需要使用141。如果您使用的是CMake版本>3.8.0,则需要使用150。这个问题与Boost更改其编号方案的方式有关。 - StAlphonzo
@StAlphonzo 感谢您的更新。您能指出Boost编号方案的更改吗?我不明白为什么会是150。 - wally
我将添加一个答案,以便它格式正确并适合小空间。 - StAlphonzo
2个回答

30

为了回答这个问题,最好从以下几点开始:

  • Microsoft如何组织其产品
  • Microsoft称其产品为什么名称
  • Microsoft如何编号它们。

因此,在我的系统上:

Microsoft Visual Studio Community 2017 has version number 15.0.26228.4. It contains:
|
+--Visual C++, informally VS, informally MSVC 
   (no version number to be found, but it is reasonable to infer 15.0) 
   which uses tools, such as
   |
   +--Toolset v141, composed of
      |
      +--compiler cl.exe version 19.10.25017.0 and
      +--linker link.exe version 14.10.25017.0 which
         |
         +--refers to CrtSDK version 14.0, and
         +--uses mspdb140.dll version 14.10.25017.0
很明显,工具集版本应该是主要参考,特别是考虑到VS 2017可以使用v140和v141进行构建。工具集清晰地定义了编译器和链接器。那么,使用"b2 toolset=msvc-14.0"编译Boost是什么意思呢?我的观点是它指的是工具集v140,而不是Microsoft Visual C++ 14.0。如何使用工具集v141进行编译呢?通常情况下,msvc通常是VS号码(例如,我系统上的VS2017为15.0),但在指定工具集时这是不准确的。接下来,我们注意到Boost将创建一个文件名包含“vcXXX”的文件,其中“vc”似乎再次暗示了Visual C++版本号的非正式概念,例如“15.0”,但肯定不能指代它,因为我们指定的是工具集。因此,在VS2017上编译最新的工具集的命令将是"b2 toolset=msvc-14.1",它将生成包含“vc141”的文件名库。如果它被命名为"v141"会更不容易混淆,但那样就没有提醒我们正在处理Microsoft工具集的提示了。
现在我将这个命令看作是:
b2 toolset=msvc-14.1
           ---- ----
             |    |
             |    +-- Toolset v141
             |
             +------- Microsoft Visual C++ (version 15.0)

最后,我们可以考虑在FindBoost.cmake中使用CMake函数。 如果编译器版本为19.10,则_boost_COMPILER应该默认为-vc141


3

CMake版本低于官方发布的v3.8.0,包括rc数字的版本,在其FindBoost.cmake中具有以下内容。

if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.10)
  set(_boost_COMPILER "-vc150")

这意味着,如果你的 Boost dlls 的命名不像 boost_date_time-vc150-mt-1_55.dll 这样,它们将无法被找到。版本 v3.8.0 开始采用了与 Boost 版本号相关的匹配方法,尽管我不记得对此进行了深入讨论。简短的答案是,如果你正在使用 cmake 版本 v3.8.0 或更高版本,则需要使用以下内容。
  if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 19.10)
    set(BOOST_TOOLSET msvc-14.1)

为了简化,在我的Windows上的Boost构建中,我总是添加以下CMake代码...

if(MSVC AND (NOT MSVC_VERSION LESS 1910))
  # Get the CMAKE version string and make sure it's not a release candidate and >= 3.8.0
  if( (CMAKE_VERSION MATCHES "^3\\.8\\.0-rc") OR (CMAKE_VERSION VERSION_LESS 3.8.0))
    message(FATAL_ERROR "CMake 3.8.0 is the minimum version required to use Boost with Visual Studio 2017 or greater")
  endif()
endif()

那让我忘记了图书馆应该被命名的整个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接