Números de versión para Visual Studio 2017, Boost y CMake


De la lista Boost mailing entiendo que VS2017 tiene los siguientes números de versión que probablemente nos interesarían:

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

Las siguientes macros están definidas en el IDE de Visual Studio 2017:

CrtSDKReferenceVersion  14.0
MSBuildToolsVersion     15.0
PlatformToolsetVersion  141
VCToolsVersion          14.10.25017
VisualStudioVersion     15.0

Durante la compilación las siguientes variables son #define ' d:

_MSC_VER                1910
_MSC_FULL_VER           191025017

cl.exe se encuentra dentro de una carpeta MSVC con la versión de VC tools. La ruta completa de la carpeta x64 es

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX64\x64

cl /Bv desde el listas de línea de comandos:

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

Aviso mspdb140.dll y link.exe se enumeran con la versión 14.10.25017.0.


Y aquí parece que msvc : 14.1 debería usarse como el conjunto de herramientas para boost. Y aquí hay otra respuesta donde algunos comentarios hablan sobre el nombre del compilador de boost.

Cuando compilo obtengo los nombres de las bibliotecas con v141 por ejemplo: boost_atomic-vc141-mt-1_64.lib


Pero en CMake la función _Boost_GUESS_COMPILER_PREFIX tiene lo siguiente:

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

Por lo que la versión debe ser ¿usado? vc141 o vc150? Does

  • v141 implica vc141, o hace
  • v141 implica vc150?
Author: Community, 2017-03-11

2 answers

Para responder a esto sería mejor comenzar con

  • cómo Microsoft estructura sus productos
  • lo que Microsoft llama sus productos y
  • cómo los numera Microsoft.

Entonces, en mi sistema:

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

Parece claro que la versión del conjunto de herramientas debe ser la referencia principal. Especialmente si se considera que VS 2017 puede construir ambos con v140 y v141. El conjunto de herramientas define cuidadosamente tanto el compilador como el enlazador.


So entonces, ¿qué significa compilar Boost con b2 toolset=msvc-14.0 por ejemplo? Mi argumento es que significa conjunto de herramientas v140, no Microsoft Visual C++ 14.0.

¿Cómo se compilaría con toolset v141? Informalmente msvc suele ser el número VS (por ejemplo, 15.0 para VS2017 en mi sistema), pero eso sería inexacto al especificar un conjunto de herramientas. A continuación, notamos que Boost creará un archivo con un nombre que contenga vcXXX donde vc nuevamente parecería implicar la noción informal de un número de versión de Visual C++ como 15.0 pero ciertamente no puede referirse a eso, ya que es el conjunto de herramientas que se está especificando.

Por lo tanto, compilar para el último conjunto de herramientas en VS2017 el comando sería b2 toolset=msvc-14.1 que generará bibliotecas con nombres de archivo que contengan vc141. Habría sido menos confuso si hubiera sido v141, pero entonces no habría habido ningún recordatorio de que estamos tratando con el conjunto de herramientas de Microsoft.

Ahora pienso en el comando como sigue:

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

Finalmente podemos considerar la Función CMake en FindBoost.cmake. El _boost_COMPILER debería ser por defecto -vc141 si la versión del compilador es 19.10.

 20
Author: wally,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-11 17:47:08

Las versiones CMake que son menores que la versión oficial v3.8.0, que incluye los números rc, tienen lo siguiente en su FindBoost.cmake.

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

Lo que significa que, si sus dll de Boost no se nombran como, por ejemplo, boost_date_time- vc150-mt-1_55.dll no serán encontrados. La versión v3.8. 0 comenzó a coincidir con el enfoque que Boost estaba tomando con respecto a los números de versión, aunque no recuerdo la discusión en profundidad del asunto. La respuesta corta es, sin embargo, si está utilizando un cmake versión v3. 8.0 o superior, necesita lo siguiente en su lugar.

  if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 19.10)
    set(BOOST_TOOLSET msvc-14.1)

Para simplificar, en mis compilaciones de Boost para Windows, siempre agrego el siguiente código 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()

Eso me permite olvidarme de todo el tema de cómo deben nombrarse las bibliotecas.

 3
Author: StAlphonzo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-05 11:13:34