web-dev-qa-db-fra.com

Recherche de la version du compilateur Microsoft C ++ à partir de la ligne de commande (pour les makefiles)

Je dois manquer quelque chose de vraiment évident, mais pour une raison quelconque, la version en ligne de commande du compilateur Microsoft C++ (cl.exe) ne semble pas prendre en charge la génération de rapports uniquement lors de son exécution. Nous en avons besoin pour écrire des makefiles qui vérifient la version du compilateur qu'un utilisateur de notre outil a installé (ils obtiennent des makefiles avec du code qu'ils doivent compiler localement, nous n'avons donc aucun contrôle sur leur version du compilateur).

Dans gcc, vous donnez simplement l'option -v ou --version pour obtenir une chaîne de version Nice imprimée.

Dans cl.exe, vous obtenez une erreur pour -v.

J'ai lu la documentation MSDN et l'aide en ligne du compilateur, et je ne trouve pas le commutateur pour simplement imprimer la version du compilateur. De façon ennuyeuse, vous obtenez toujours la version lorsque le compilateur démarre ... mais vous ne semblez pas pouvoir démarrer le compilateur juste pour en extraire la version.

Trouver le fournisseur/la version du compilateur en utilisant qmake semblait similaire, mais ne traite que du cas simple de gcc.

J'essaye ceci avec VC++ Express 2005, si cela importe. J'espérais que ce ne serait pas le cas, car il est préférable de détecter la version du compilateur d'une manière indépendante de la version du compilateur :)

Mise à jour, après réponses:

  • L'exécution de cl.exe sans aucun argument affiche sa version et du texte d'aide.
  • Cela ressemble à la façon la plus portable d'obtenir la version, à travers les versions de vc.
  • Vous devez ensuite analyser une sortie multiligne, mais ce n'est pas trop difficile.
  • Nous l'avons fait à la fin, et cela fonctionne.
48
jakobengblom2

Êtes-vous sûr que vous ne pouvez pas simplement exécuter cl.exe sans aucune entrée pour qu'il signale sa version?

Je viens de tester l'exécution de cl.exe dans l'invite de commande pour VS 2008, 2005 et .NET 2003 et ils ont tous signalé sa version.

Pour 2008:

d:\Program Files\Microsoft Visual Studio 9.0\VC> cl

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 pour 80x86

Pour 2005, SP 1 (classes Safe Standard C++ ajoutées):

C:\Program Files\Microsoft Visual Studio 8\VC> cl

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 pour 80x86

Pour 2005:

C:\Program Files\Microsoft Visual Studio 8\VC> cl

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 pour 80x86

Pour .NET 2003:

Compilateur d'optimisation C/C++ 32 bits Microsoft (R) version 13.10.6030 pour 80x86

MODIFIER

Pour 2010, ce sera dans la ligne de:

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.XX.YYYYY.ZZ pour 80x86

ou selon la plateforme ciblée

Microsoft (R) C/C++ Optimizing Compiler Version 16.XX.YYYYY.ZZ pour x64

Pour 2012:

Compilateur d'optimisation Microsoft (R) C/C++ version 17.XX.YYYYY.ZZ pour $$$

où $$$ est la plate-forme ciblée (par exemple x86, x64, ARM) et XX, YYYYY et ZZ sont des numéros de version mineurs.

Pour 2013:

Compilateur d'optimisation Microsoft (R) C/C++ version 18.XX.YYYYY.ZZ pour $$$

où $$$ est la plate-forme ciblée (par exemple x86, x64, ARM) et XX, YYYYY et ZZ sont des numéros de version mineurs.

Pour 2015:

Compilateur d'optimisation Microsoft (R) C/C++ version 19.XX.YYYYY pour $$$

où $$$ est la plate-forme cible (par exemple x86, x64, ARM), et XX et YYYYY sont des numéros de version mineurs.

37
KTC

J'ai eu le même problème aujourd'hui. J'avais besoin de définir un indicateur dans un Makefile nmake si la version du compilateur cl est 15. Voici le hack que j'ai trouvé:

!IF ([cl /? 2>&1 | findstr /C:"Version 15" > nul] == 0)
FLAG = "cl version 15"
!ENDIF

Notez que cl /? imprime les informations de version dans le flux d'erreur standard et le texte d'aide dans la sortie standard. Pour pouvoir vérifier la version avec la commande findstr, il faut d'abord rediriger stderr vers stdout en utilisant 2>&1.

L'idée ci-dessus peut être utilisée pour écrire un fichier de commandes Windows qui vérifie si la version du compilateur cl est <= un nombre donné. Voici le code de cl_version_LE.bat:

@echo off
FOR /L %%G IN (10,1,%1) DO cl /? 2>&1 | findstr /C:"Version %%G" > nul && goto FOUND
EXIT /B 0
:FOUND
EXIT /B 1

Maintenant, si vous souhaitez définir un indicateur dans votre Makefile nmake si la version cl <= 15, vous pouvez utiliser:

!IF [cl_version_LE.bat 15]
FLAG = "cl version <= 15"
!ENDIF
9
Linoliumz

Créez un fichier .c contenant uniquement la ligne:

_MSC_VER

ou

CompilerVersion=_MSC_VER

puis prétraitez avec

cl /nologo /EP <filename>.c

Il est facile d'analyser la sortie.

2
Rexo

Jetez un œil à Fonctionnalités C++ 11 (C++ moderne)

et la section "Guide de référence rapide pour les numéros de version de Visual C++" ...

Exécutez-le simplement sans options.

P:\>cl.exe
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]
1
Mark