Visual Studio 2017,Boost和CMake的版本号

wal*_*lly 26 c++ boost cmake visual-studio-2017

从Boost邮件列表中我了解到VS2017具有以下我们可能最感兴趣的版本号:

Visual Studio           15.0
cl; C/C++ Compiler      19.10
Platform Toolset:       v141
Run Code Online (Sandbox Code Playgroud)

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

CrtSDKReferenceVersion  14.0
MSBuildToolsVersion     15.0
PlatformToolsetVersion  141
VCToolsVersion          14.10.25017
VisualStudioVersion     15.0
Run Code Online (Sandbox Code Playgroud)

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

_MSC_VER                1910
_MSC_FULL_VER           191025017
Run Code Online (Sandbox Code Playgroud)

cl.exe 包含在具有 VC工具版本的MSVC文件夹中.完整的x64文件夹路径是

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

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
Run Code Online (Sandbox Code Playgroud)

请注意mspdb140.dll,并link.exe与14.10.25017.0版本上市.


这里似乎msvc : 14.1应该被用作工具集提升.而这里是另一个答案,其中一些意见谈升压转换器的编译器命名.

当我编译时,我用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")
Run Code Online (Sandbox Code Playgroud)

那么应该使用哪个版本?vc141还是vc150?是否

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

wal*_*lly 27

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

  • 微软如何构建其产品
  • 微软所称的产品和产品
  • 微软如何评价他们.

所以,在我的系统上:

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
Run Code Online (Sandbox Code Playgroud)

很明显,工具集版本应该是主要参考.特别是如果一个人认为VS 2017可以用v140和建立v141.该工具集巧妙地定义了编译器和链接器.


那么,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,但是之后就没有提醒我们正在处理微软的工具集.

我现在想到的命令如下:

b2 toolset=msvc-14.1
           ---- ----
             |    |
             |    +-- Toolset v141
             |
             +------- Microsoft Visual C++ (version 15.0)
Run Code Online (Sandbox Code Playgroud)

最后我们可以考虑CMake功能FindBoost.cmake.本_boost_COMPILER应默认-vc141如果编译器版本19.10.