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

je dois rater 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 supporter le reporting uniquement dans sa version lorsqu'il est exécuté. Nous avons besoin de cela pour écrire des makefiles qui vérifient la version du compilateur qu'un utilisateur de notre outil a installé (ils obtiennent des makefiles avec le code qu'ils doivent compiler eux-mêmes localement, donc nous n'avons aucun contrôle sur leur version du compilateur).

dans gcc, vous donnez juste l'option-v ou -- version pour imprimer une chaîne de caractères.

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

j'ai lu les docs MSDN et l'aide en ligne de compilateur, et je ne peux pas trouver le commutateur pour juste Imprimer la version de compilateur. Fâcheusement, vous obtenez toujours la version lorsque le compilateur commence... mais vous ne semblez pas être capable de démarrer le compilateur juste pour en extraire la version.

trouver un compilateur fournisseur / version utilisant qmake semble similaire, mais ne traite que du cas simple de gcc.

je suis en train d'essayer cela avec VC++ Express 2005, si ce qui compte. J'espérais que ce ne serait pas le cas, car la détection de la version du compilateur est mieux faite d'une manière indépendante de la version du compilateur:)

mise à Jour, d'après les réponses:

  • Exécution de cl.exe sans aucun argument imprime sa version et de l'aide texte.
  • cela ressemble à la la plupart des façon portable de se rendre à la version, à travers les versions vc.
  • vous devez alors analyse une sortie multi-ligne, mais que n'est pas trop difficile.
  • nous avons fait ceci en à la fin, et ça fonctionne.
44
demandé sur Community 2009-08-05 17:37:38

6 réponses

Êtes-vous sûr que vous ne pouvez pas juste exécuter cl.exe sans aucune contribution pour lui de déclarer sa version?

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

pour 2008:

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

Microsoft (R) 32 bits en C/C++ Compilateur Optimisant la Version 15.00.30729.01 pour 80x86

Pour 2005, SP 1 (ajouté Sûr Standard C++ classes):

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

Microsoft (R) 32 bits en C/C++ Compilateur Optimisant la Version 14.00.50727.762 pour 80x86

pour 2005:

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

Microsoft (R) 32-bit C / C++ Optimisation de la Version de compilateur 14.00.50727.42 pour 80x86

pour .NET 2003:

Microsoft (R) 32 bits en C/C++ Compilateur Optimisant la Version 13.10.6030 pour 80x86

MODIFIER

Pour 2010, ce sera le long de la ligne de:

Microsoft (R) 32 bits en C/C++ Compilateur Optimisant la Version 16.XX.YYYYY.ZZ pour 80x86

ou selon la plate-forme ciblée

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

pour 2012:

Microsoft (R) C / C++ Optimizing Compiler Version 17.XX.YYYYY.ZZ pour $ $ $ 151910920"

où $$$ est la plate-forme ciblée( par exemple x86, x64, ARM), et XX, YYYYY, et ZZ sont des versions mineures nombre.

pour 2013:

Microsoft (R) C / C++ Optimizing Compiler Version 18.XX.YYYYY.ZZ pour $ $ $ 151910920"

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:

Microsoft (R) C / C++ Optimizing Compiler Version 19.XX.YYYYY pour $ $ $ 151910920"

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

37
répondu KTC 2017-03-18 21:27:09

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

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

noter que cl /? imprime l'information de version au flux d'erreur standard et le texte d'aide à 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é pour écrire un fichier Windows batch 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 voulez mettre un drapeau dans votre Makefile NMAKE si la version cl <= 15, vous pouvez utiliser:

!IF [cl_version_LE.bat 15]
FLAG = "cl version <= 15"
!ENDIF
7
répondu Linoliumz 2012-09-26 18:34:32

il suffit de l'exécuter 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
répondu Mark 2009-08-05 13:43:08

regarder C++11 Caractéristiques (C++ Moderne)

et la section "Guide de Référence Rapide pour Visual C++ Numéros de Version" ...

1
répondu Tomasz Damian Dziechciarz 2015-01-21 13:39:48

créer un .c fichier contenant la ligne:

_MSC_VER

ou

CompilerVersion=_MSC_VER

puis pré-process avec

cl /nologo /EP <filename>.c

il est facile de parser la sortie.

1
répondu Rexo 2018-08-30 04:31:32

, Essayez:

cl /v

en fait, chaque fois que je donne un argument à cl, il imprime le numéro de version sur la première ligne.

vous pouvez simplement lui donner un argument poubelle et puis analyser la première ligne de la sortie, qui contient le nombre de verison.

-3
répondu samoz 2009-08-05 13:40:33