Visual Studio 2017、Boost 和 CMake 的版本号
Version numbers for Visual Studio 2017, Boost and CMake
From the Boost mailing 列表我了解到 VS2017 具有以下我们可能最感兴趣的版本号:
Visual Studio 15.0
cl; C/C++ Compiler 19.10
Platform Toolset: v141
Visual Studio2017IDE中定义了以下宏:
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
is contained within an MSVC folder 与 VC 工具版本。完整的 x64
文件夹路径是
C:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.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.dll
和 link.exe
与版本 14.10.25017.0 一起列出。
和 it seems that msvc : 14.1
should be used as the toolset for boost. And 一些评论讨论了 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
?
为了回答这个问题最好从
开始
- 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 编号(例如 15.0
for VS2017 on my system),但在指定工具集时这将是不准确的。接下来,我们注意到 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
低于官方版本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 在版本号方面采用的方法相匹配,尽管我不记得对此事的深入讨论。简短的回答是,如果您使用的是 v3.8.0 或更高版本的 cmake,则需要以下内容。
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()
这让我忘记了库应该命名的整个问题。
From the Boost mailing 列表我了解到 VS2017 具有以下我们可能最感兴趣的版本号:
Visual Studio 15.0
cl; C/C++ Compiler 19.10
Platform Toolset: v141
Visual Studio2017IDE中定义了以下宏:
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
is contained within an MSVC folder 与 VC 工具版本。完整的 x64
文件夹路径是
C:\Program Files (x86)\Microsoft Visual Studio17\Community\VC\Tools\MSVC.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.dll
和 link.exe
与版本 14.10.25017.0 一起列出。
和 msvc : 14.1
should be used as the toolset for boost. And
当我编译时,我得到了带有 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
?
为了回答这个问题最好从
开始- 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 编号(例如 15.0
for VS2017 on my system),但在指定工具集时这将是不准确的。接下来,我们注意到 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
低于官方版本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 在版本号方面采用的方法相匹配,尽管我不记得对此事的深入讨论。简短的回答是,如果您使用的是 v3.8.0 或更高版本的 cmake,则需要以下内容。
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()
这让我忘记了库应该命名的整个问题。