web-dev-qa-db-fra.com

Numéros de version pour Visual Studio 2017, Boost et CMake

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.exeest 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 fait
  • v141 Implique vc150?
26
wally

Afin de répondre à cette question, il serait préférable de commencer par

  • comment Microsoft structure ses produits
  • ce que Microsoft appelle ses produits et
  • comment Microsoft les numérote.

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 vcXXXvc 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.

27
wally

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.

3
StAlphonzo