【问题标题】:Version numbers for Visual Studio 2017, Boost and CMakeVisual Studio 2017、Boost 和 CMake 的版本号
【发布时间】:2017-08-01 12:17:26
【问题描述】:

From the Boost mailing list 我知道VS2017有以下我们可能最感兴趣的版本号:

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

以下宏在 Visual Studio 2017 IDE 中定义:

CrtSDKReferenceVersion  14.0
MSBuildToolsVersion     15.0
PlatformToolsetVersion  141
VCToolsVersion          14.10.25017
VisualStudioVersion     15.0

在编译期间,以下变量为#define'd:

_MSC_VER                1910
_MSC_FULL_VER           191025017

cl.exe is contained within an MSVC folder 与 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 一起列出。


here 似乎应该将msvc : 14.1 用作boost 的工具集。还有here is another answer 一些cmets 谈论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 还是 vc150?有没有

  • v141 暗示vc141,或者是
  • v141 暗示vc150?

【问题讨论】:

  • vc150 对我来说似乎是 CMake 的 _Boost_GUESS_COMPILER_PREFIX 中的一个错误。您使用的是什么版本的 CMake? VS2017 的工具集 v141 与 VS2015 的 v140 二进制兼容,我听说没有 v(c)150。很可能,那个 CMake 宏的开发者正在推断和猜测 VS2017 的工具集。
  • @Torbjörn 同意。有一个 VC 15.0,但没有工具集 15.0(还),文件名指的是工具集。我正在使用 CMake 3.8.0-rc1。
  • 如果你使用的是CMake版本3.8.0你需要使用150。这个问题必须与 Boost 更改编号方案的方式有关。
  • @StAlphonzo 感谢您的更新。您能否指出 Boost 编号方案的更改?我不明白为什么会是 150。
  • 我将添加一个答案,使其格式正确并适合狭小的空间。

标签: c++ boost cmake visual-studio-2017


【解决方案1】:

为了回答这个问题,最好从

  • 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 可以同时使用 v140v141 构建。该工具集巧妙地定义了编译器和链接器。


那么,例如使用b2 toolset=msvc-14.0 编译Boost 意味着什么?我的论点是它意味着工具集 v140,而不是 Microsoft Visual C++ 14.0

如何使用工具集v141 进行编译?非正式地 msvc 通常是 VS 编号(例如,15.0 代表我系统上的 VS2017),但在指定工具集时会不准确。接下来,我们注意到 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

【讨论】:

    【解决方案2】:

    低于官方版本 v3.8.0 的 CMake 版本,其中包括 rc 编号,在 FindBoost.cmake 中有以下内容。

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

    这意味着,如果您的 Boost dll 未命名,例如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()
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多