c++ boost cmake visual-studio-2017

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



visual-studio-2017 (2)

De la lista de correo de Boost , entiendo que VS2017 tiene los siguientes números de versión que probablemente nos interesen más:

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

Las siguientes macros se definen 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 está contenido dentro de una carpeta MSVC con la versión de herramientas de VC. 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 la lista de líneas de comando:

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

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

Y here parece que msvc : 14.1 debería usarse como el conjunto de herramientas para impulsar. 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")

Entonces, ¿qué versión debería usarse? vc141 o vc150 ? Hace

  • v141 implica vc141 , o hace
  • v141 implica vc150 ?

Las versiones de CMake que son menores que la versión oficial v3.8.0, que incluye los números de 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 Boost no tienen nombres como, por ejemplo, boost_date_time- vc150 -mt-1_55.dll, no se encontrarán. La versión v3.8.0 comenzó a emparejar 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. Sin embargo, la respuesta corta es que si está utilizando una versión cmake v3.8.0 o superior, necesita lo siguiente.

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 asunto de cómo deberían llamarse las bibliotecas.


Para contestar esto sería mejor comenzar con

  • Cómo Microsoft estructura sus productos.
  • lo que Microsoft llama sus productos y
  • Cómo Microsoft los enumera.

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 tanto con v140 como con v141 . El conjunto de herramientas define claramente tanto el compilador como el enlazador.

Entonces, ¿qué significa compilar Boost con b2 toolset=msvc-14.0 por ejemplo? Mi opinión es que significa el conjunto de herramientas v140 , no Microsoft Visual C ++ 14.0 .

¿Cómo se compilaría uno con el conjunto de herramientas v141 ? Informalmente, msvc suele ser el número VS (por ejemplo, 15.0 para VS2017 en mi sistema), pero eso sería incorrecto al especificar un conjunto de herramientas. A continuación, notamos que Boost creará un archivo con un nombre que contiene vcXXX donde vc parecerá nuevamente 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, al compilar el último conjunto de herramientas en VS2017, el comando sería b2 toolset=msvc-14.1 que generará bibliotecas con nombres de archivo que contienen 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 de la siguiente manera:

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 tener como valor predeterminado -vc141 si la versión del compilador es 19.10 .