Visual Studio 2017,Boost和CMake的版本号

时间:2017-03-11 01:59:30

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

From the Boost mailing列表我知道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
带有VC工具版本的

cl.exe is contained within an MSVC folder。完整的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应该用作提升的工具集。 here is another answer其中一些评论讨论了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")

那么应该使用哪个版本? vc141vc150

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

2 个答案:

答案 0 :(得分:23)

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

开始
  • 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编号(例如我系统上VS2017的15.0),但在指定工具集时这是不准确的。接下来,我们注意到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)

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

答案 1 :(得分:3)

CMake版本低于正式版本v3.8.0,其中包含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()

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