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

Je dois être en train de 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 prendre en charge uniquement la génération de rapports lors de son exécution. Nous avons besoin de ceci pour écrire les fichiers makefiles qui vérifient la version du compilateur qu’un utilisateur de notre outil a installée (ils obtiennent des fichiers makefiles avec le code qu’ils doivent comstackr localement, donc nous n’avons aucun contrôle sur leur version du compilateur).

Dans gcc, il suffit de donner l’option -v ou –version pour obtenir une belle chaîne de version imprimée.

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

J’ai lu l’aide en ligne de MSDN sur les documents et le compilateur, et je n’arrive pas à trouver le commutateur pour imprimer la version du compilateur. Malheureusement, vous obtenez toujours la version au démarrage du compilateur … mais vous ne semblez pas pouvoir démarrer le compilateur juste pour en sortir la version.

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

Je tente ceci avec VC ++ Express 2005, si cela compte. J’espérais que ce ne serait pas le cas, car il est préférable de détecter la version du compilateur de manière indépendante du compilateur 🙂

Mise à jour, après les réponses:

  • L’exécution de cl.exe sans aucun argument imprime sa version et du texte d’aide.
  • Cela ressemble à la manière la plus portable d’obtenir la version, sur toutes les versions de vc.
  • Vous devez ensuite parsingr une sortie multiligne, mais ce n’est pas trop difficile.
  • Nous l’avons fait à la fin, et ça marche.

Êtes-vous sûr de ne pas pouvoir exécuter cl.exe sans aucune saisie pour signaler 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 (C) 32 bits C / C ++ Optimisation de la version du compilateur 15.00.30729.01 pour 80×86

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

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

Version du compilateur Microsoft (R) 32 bits C / C ++ version 14.00.50727.762 pour 80×86

Pour 2005:

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

Microsoft (C) 32 bits C / C ++ optimisant la version du compilateur 14.00.50727.42 pour 80×86

Pour .NET 2003:

Version du compilateur Microsoft (R) 32 bits C / C ++ version 13.10.6030 pour 80×86

MODIFIER

Pour 2010, il s’agira de:

Version du compilateur Microsoft (R) 32 bits C / C ++ version 16.XX.YYYYY.ZZ pour 80×86

ou en fonction de la plate-forme ciblée

Microsoft (C) C / C ++ Optimisation de la version du compilateur 16.XX.YYYYY.ZZ pour x64

Pour 2012:

Microsoft (R) C / C ++ Optimisation de la version du compilateur 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:

Microsoft (R) C / C ++ Optimisation de la version du compilateur 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:

Microsoft (C) C / C ++ Optimisation de la version du compilateur 19.XX.YYYYY pour $$$

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

J’ai eu le même problème aujourd’hui. J’avais besoin de définir un drapeau dans un Makefile nmake si la version du compilateur cl était 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 stream 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 redirect 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 voulez définir 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 

Il suffit de l’exécuter sans options.

 P:\>cl.exe Microsoft (R) 32-bit C/C++ Optimizing Comstackr Version 12.00.8168 for 80x86 Copyright (C) Microsoft Corp 1984-1998. All rights reserved. usage: cl [ option... ] filename... [ /link linkoption... ] 

Jetez un coup d’œil aux fonctionnalités de C ++ 11 (Modern C ++)

et section “Guide de référence rapide des numéros de version de Visual C ++” …

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

 _MSC_VER 

ou

 ComstackrVersion=_MSC_VER 

puis pré-processus avec

 cl /nologo /EP .c 

Il est facile d’parsingr la sortie.

Essayer:

 cl /v 

En fait, chaque fois que je donne un argument, il affiche le numéro de version sur la première ligne.

Vous pouvez simplement lui alimenter un argument vide, puis parsingr la première ligne de la sortie, qui contient le numéro de verison.