从命令行查找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号的输出的第一行。