Подтвердить что ты не робот

Номера версий для Visual Studio 2017, Boost и CMake

Из списка рассылки Boost я понимаю, что VS2017 имеет следующие номера версий, которые нам, вероятно, будут наиболее интересны:

Visual Studio           15.0
cl; C/C++ Compiler      19.10
Platform Toolset:       v141

В среде IDE Visual Studio 2017 определены следующие макросы:

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.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")

Итак, какую версию следует использовать? vc141 или vc150? Делает

  • v141 imply vc141, или
  • v141 imply vc150?
4b9b3361

Ответ 1

Чтобы ответить на это, лучше всего начинать с

  • как 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. Набор инструментов аккуратно определяет как компилятор, так и компоновщик.


Итак, что же означает, например, скомпилировать Boost с помощью b2 toolset=msvc-14.0? Я утверждаю, что это означает набор инструментов v140, а не Microsoft Visual С++ 14.0.

Как скомпилировать с помощью набора инструментов v141? Обычно msvc обычно представляет собой номер VS (например, 15.0 для VS2017 в моей системе), но это было бы неточно при указании набора инструментов. Затем отметим, что Boost создаст файл с именем, содержащим vcXXX, где vc снова будет казаться неформальным понятием версии версии Visual С++, например 15.0, но, конечно, не может ссылаться на это, поскольку это набор инструментов, который указывается.

Итак, компиляция для последнего набора инструментов на VS2017 будет b2 toolset=msvc-14.1, которая будет генерировать библиотеки с именами файлов, содержащими vc141. Было бы менее сложно, если бы это было v141, но тогда не было бы напоминаний о том, что мы имеем дело с набором инструментов Microsoft.

Теперь я думаю о команде следующим образом:

b2 toolset=msvc-14.1
           ---- ----
             |    |
             |    +-- Toolset v141
             |
             +------- Microsoft Visual C++ (version 15.0)

Наконец, мы можем рассмотреть функцию CMake в FindBoost.cmake. _boost_COMPILER должен иметь значение -vc141, если версия компилятора 19.10.

Ответ 2

версии CMake, которые меньше официального релиза v3.8.0, который включает номера rc, имеют следующие значения в FindBoost.cmake.

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

что означает, что если ваши DLL файлы Boost не называются, например, 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)

Для простоты в моих Boost-сборках для Windows я всегда добавляю следующий код CMake.

if(MSVC AND (NOT MSVC_VERSION LESS 1910))
  # Get the CMAKE version string and make sure it 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()

Это позволяет мне забыть обо всем, что нужно назвать библиотекам.