web-dev-qa-db-ja.com

Visual Studio 2017、Boost、CMakeのバージョン番号

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.exeMSVCフォルダーに含まれています with VC tools version。The complete 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.dllおよびlink.exeはバージョン14.10.25017.0でリストされています。


そして ここmsvc : 14.1は、ブーストのツールセットとして使用する必要があります。 ここに別の答えがあります ここで、boostのコンパイラの命名についてのコメントがあります。

コンパイルすると、v141でライブラリ名が取得されます。例:boost_atomic-vc141-mt-1_64.lib


しかし、CMで_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
26
wally

これに答えるには、最初から始めるのが最善でしょう

  • マイクロソフトの製品構造
  • マイクロソフトが製品と呼んでいるもの
  • マイクロソフトがそれらに番号を付ける方法。

だから、私のシステムでは:

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をコンパイルするとはどういう意味ですか?私の主張は、Microsoft Visual C++ v140ではなく、ツールセット14.0を意味するということです。

ツールセットv141を使用してどのようにコンパイルしますか?通常、msvcは通常VS番号(たとえば、私のシステムのVS2017の15.0)ですが、ツールセットを指定するときに不正確になります。次に、BoostはvcXXXを含む名前のファイルを作成することに注意してください。ここで、vcは、15.0などのVisual C++バージョン番号の非公式な概念を暗示するように見えますが、指定されているのはツールセットであるため、それを参照することはできません。

したがって、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になります。

27
wally

Rc番号を含む公式リリースv3.8.0よりも小さいCMakeバージョンでは、FindBoost.cmakeに次のものが含まれています。

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

つまり、Boost dllに名前が付けられていない場合、たとえばboost_date_time -vc15-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()

これにより、ライブラリの名前の問題全体を忘れることができます。

3
StAlphonzo