De la liste de diffusion Boost Je comprends que VS2017 a les numéros de version suivants qui pourraient nous intéresser le plus:
Visual Studio 15.0
cl; C/C++ Compiler 19.10
Platform Toolset: v141
Les macros suivantes sont définies dans l'IDE de Visual Studio 2017:
CrtSDKReferenceVersion 14.0
MSBuildToolsVersion 15.0
PlatformToolsetVersion 141
VCToolsVersion 14.10.25017
VisualStudioVersion 15.0
Lors de la compilation, les variables suivantes sont #define
'':
_MSC_VER 1910
_MSC_FULL_VER 191025017
cl.exe
est contenu dans un dossier MSVC avec la version VC de l'outil. Le chemin complet du dossier x64
Est
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX64\x64
cl /Bv
À partir des listes de lignes de commande:
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
Avis mspdb140.dll
Et link.exe
Sont répertoriés avec la version 14.10.25017.0.
Et ici il semble que msvc : 14.1
Devrait être utilisé comme jeu d'outils pour le boost. Et voici une autre réponse où certains commentaires parlent de la dénomination du compilateur de boost.
Lorsque je compile, je reçois les noms de bibliothèques avec v141, par exemple: boost_atomic-vc141-mt-1_64.lib
Mais dans CMake, la fonction _Boost_GUESS_COMPILER_PREFIX
Présente les caractéristiques suivantes:
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")
Alors quelle version doit être utilisée? vc141
Ou vc150
? Est-ce que
v141
Implique vc141
, Ou le faitv141
Implique vc150
?Afin de répondre à cette question, il serait préférable de commencer par
Donc, sur mon système:
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
Il semble clair que la version de la boîte à outils devrait être la référence principale. Surtout si on considère que VS 2017 peut construire les deux avec v140
et v141
. Le jeu d'outils définit proprement le compilateur et l'éditeur de liens.
Alors, que signifie compiler Boost avec b2 toolset=msvc-14.0
par exemple? Mon argument est que cela signifie ensemble d'outils v140
, pas Microsoft Visual C++ 14.0
.
Comment compiler avec toolset v141
? De manière informelle, msvc est généralement le numéro du VS (par exemple, 15.0
pour VS2017 sur mon système), mais cela serait inexact lors de la spécification d’un jeu d’outils. Nous notons ensuite que Boost créera un fichier avec un nom contenant vcXXX
où vc
semblerait impliquer à nouveau la notion informelle de numéro de version de Visual C++, tel que 15.0
mais ne peut certainement pas s'y référer car c'est l'ensemble d'outils qui est spécifié.
Donc, en compilant pour le dernier jeu d'outils sur VS2017, la commande serait b2 toolset=msvc-14.1
qui générera des bibliothèques avec des noms de fichiers contenant vc141
. Cela aurait été moins déroutant si cela avait été v141
, mais il n’y aurait pas eu de rappel que nous avions affaire à l’ensemble d’outils de Microsoft.
Je pense maintenant à la commande comme suit:
b2 toolset=msvc-14.1
---- ----
| |
| +-- Toolset v141
|
+------- Microsoft Visual C++ (version 15.0)
Enfin, nous pouvons considérer la fonction CMake dans FindBoost.cmake
. Le _boost_COMPILER
par défaut, -vc141
si la version du compilateur est 19.10
.
Les versions de CMake qui sont inférieures à la version officielle v3.8.0, qui comprend les numéros de code retour ont les éléments suivants dans leur FindBoost.cmake.
if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.10)
set(_boost_COMPILER "-vc150")
ce qui signifie que, si vos dll Boost ne sont pas nommées, par exemple. boost_date_time -vc15 - mt-1_55.dll ils ne seront pas trouvés. La version v3.8.0 a commencé à correspondre à l'approche adoptée par Boost en ce qui concerne les numéros de version, bien que je ne me souvienne pas de la discussion approfondie à ce sujet. La réponse courte est que, si vous utilisez une version 3.8.0 ou supérieure de cmake, vous avez plutôt besoin de ce qui suit.
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 19.10)
set(BOOST_TOOLSET msvc-14.1)
Pour plus de simplicité, dans mes versions Boost pour Windows, j'ajoute toujours le code CMake suivant.
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()
Cela me laisse oublier toute la question de ce que les bibliothèques devraient être nommés.