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
implicavc141
, o hace -
v141
implicavc150
?
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
.
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.
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