1. ホーム
  2. c++

[解決済み] Visual Studio 2017、Boost、CMakeのバージョン番号について

2022-02-07 06:02:43

質問内容

Boostメーリングリストより リスト 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 は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 または vc150 ? は?

  • v141 インプリ vc141 それとも
  • v141 暗示する vc150 ?

解決方法は?

この質問に答えるには、次のことから始めるのが最善でしょう。

  • マイクロソフトの製品構成
  • マイクロソフトの製品の呼び方と
  • マイクロソフトの番号の付け方。

それで、私のシステム上では

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 . ツールセットでは、コンパイラとリンカの両方がきちんと定義されています。


では、Boostをコンパイルする際に b2 toolset=msvc-14.0 を例に挙げてください。私の主張では、それはツールセット 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)


最後に、CMake の関数を FindBoost.cmake . その _boost_COMPILER をデフォルトにする必要があります。 -vc141 の場合、コンパイラのバージョンは 19.10 .