从命令行查找Microsoft C ++编译器的版本(对于makefiles)

我必须错过一些非常明显的东西,但由于某种原因,Microsoft C ++编译器(cl.exe)的命令行版本在运行时似乎不支持报告其版本。 我们需要这个编写makefile来检查我们工具的用户已经安装的编译器版本(他们得到的makefile中包含自己编译的代码,所以我们无法控制它们的编译器版本)。

在gcc中,您只需提供选项-v或–version即可获得打印的完美版本string。

在cl.exe中,出现-v错误。

我已阅读MSDN文档和编译器联机帮助,我找不到打印编译器版本的开关。 烦人的是,当编译器启动的时候,你总是得到这个版本……但是你似乎不能启动编译器只是为了从中获得版本。

使用qmake查找编译器供应商/版本似乎相似,但只处理gcc的简单情况。

如果有问题,我正在尝试使用VC ++ Express 2005。 我希望它不会,因为检测编译器版本是最好的独立于编译器版本的方式:)

更新后,回复:

  • 不带任何参数运行cl.exe会打印其版本和一些帮助文本。
  • 在vc版本中,这看起来是最便捷的版本。
  • 然后你必须parsing一个多行输出,但这并不难。
  • 我们最终做到了这一点,并且工作。

你确定你不能没有任何input运行cl.exe来报告它的版本?

我刚刚在VS 2008,2005和.NET 2003的命令提示符中testing了运行cl.exe,并且都报告了它的版本。

对于2008年:

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

Microsoft(R)32位C / C ++优化编译器版本15.00.30729.01,适用于80×86

对于2005年,SP 1(增加了安全标准C ++类):

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

Microsoft(R)32位C / C ++优化编译器版本14.00.50727.762(适用于80×86)

2005年:

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

Microsoft(R)32位C / C ++优化编译器版本14.00.50727.42,适用于80×86

对于.NET 2003:

Microsoft(R)32位C / C ++为80×86优化编译器版本13.10.6030

编辑

对于2010年来说,这将是:

Microsoft(R)32位C / C ++优化编译器版本16.XX.YYYYY.ZZ为80×86

或取决于目标平台

Microsoft(R)C / C ++为x64优化编译器版本16.XX.YYYYY.ZZ

对于2012年:

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

其中$$$是目标平台(例如x86,x64,ARM),而XX,YYYYY和ZZ是次要版本号。

2013年:

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

其中$$$是目标平台(例如x86,x64,ARM),而XX,YYYYY和ZZ是次要版本号。

2015年:

Microsoft(R)C / C ++针对$$$优化编译器版本19.XX.YYYYY

其中$$$是目标平台(例如x86,x64,ARM),XX和YYYYY是次要版本号。

我今天也有同样的问题。 如果cl编译器版本是15,我需要在nmake Makefile中设置一个标志。下面是我提出的黑客攻击:

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

注意cl /? 将版本信息打印到标准错误stream,并将帮助文本打印到标准输出。 为了能够使用findstr命令检查版本,必须首先使用2>&1将stderrredirect到stdout。

上面的想法可以用来编写一个Windowsbatch file来检查cl编译器版本是否是给定的数字。 这里是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 

现在,如果你想在nmake Makefile中设置一个标志,如果cl版本<= 15,你可以使用:

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

看一看C ++ 11的特性(Modern C ++)

和“Visual C ++版本号快速参考指南”部分…

只是运行它没有select。

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

尝试:

 cl /v 

其实,任何时候我都给出一个参数,它会在第一行打印版本号。

你可以给它一个垃圾参数,然后parsing包含verison号的输出的第一行。