我必须遗漏一些非常明显的东西,但出于某种原因,Microsoft C ++编译器(cl.exe)的命令行版本似乎不支持在运行时报告其版本。我们需要这个来编写makefile,检查我们工具的用户已经安装的编译器版本(他们使用代码获取makefile,他们在本地编译自己,所以我们无法控制他们的编译器版本)。
在gcc中,你只需要选择-v或--version来打印一个漂亮的版本字符串。
在cl.exe中,-v会出错。
我已经阅读过MSDN文档和编译器在线帮助,而且我找不到只打印编译器版本的开关。令人讨厌的是,你总是在编译器启动时得到版本......但你似乎无法启动编译器只是为了从中获取版本。
Finding compiler vendor / version using qmake似乎相似,但仅涉及gcc的简单情况。
我正在尝试使用VC ++ Express 2005,如果这很重要的话。我希望它不会,因为检测编译器版本最好以与编译器版本无关的方式完成:)
回复后更新:
答案 0 :(得分:37)
您确定无法在没有任何输入的情况下运行cl.exe来报告其版本吗?
我刚刚在VS 2008,2005和.NET 2003的命令提示符下测试了运行cl.exe,他们都报告了它的版本。
2008年:
d:\ Program Files \ Microsoft Visual Studio 9.0 \ VC> cl
Microsoft(R)32位C / C ++优化编译器版本15.00.30729.01 for 80x86
对于2005年,SP 1(添加了安全标准C ++类):
C:\ Program Files \ Microsoft Visual Studio 8 \ VC> cl
Microsoft(R)32位C / C ++优化编译器版本14.00.50727.762(适用于80x86)
2005年:
C:\ Program Files \ Microsoft Visual Studio 8 \ VC> cl
Microsoft(R)32位C / C ++优化编译器版本14.00.50727.42 for 80x86
对于.NET 2003:
Microsoft(R)32位C / C ++优化编译器版本13.10.6030 for 80x86
修改强>
对于2010年,它将沿着以下方向:
Microsoft(R)32位C / C ++优化编译器版本16.XX.YYYYY.ZZ for 80x86
或取决于目标平台
Microsoft(R)C / C ++优化编译器版本16.XX.YYYYY.ZZ for x64
2012年:
Microsoft(R)C / C ++优化编译器版本17.XX.YYYYY.ZZ for $$$
其中$$$是目标平台(例如x86,x64,ARM),XX,YYYYY和ZZ是次要版本号。
2013年:
Microsoft(R)C / C ++优化编译器版本18.XX.YYYYY.ZZ for $$$
其中$$$是目标平台(例如x86,x64,ARM),XX,YYYYY和ZZ是次要版本号。
2015年:
Microsoft(R)C / C ++优化编译器版本19.XX.YYYYY for $$$
其中$$$是目标平台(例如x86,x64,ARM),XX和YYYYY是次要版本号。
答案 1 :(得分:9)
我今天遇到了同样的问题。如果cl编译器版本是15,我需要在nmake Makefile中设置一个标志。这是我提出的hack:
!IF ([cl /? 2>&1 | findstr /C:"Version 15" > nul] == 0)
FLAG = "cl version 15"
!ENDIF
请注意,cl /?
将版本信息打印到标准错误流,将帮助文本打印到标准输出。为了能够使用findstr
命令检查版本,必须首先使用2>&1
将stderr重定向到stdout。
上述想法可用于编写Windows批处理文件,该文件检查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
答案 2 :(得分:2)
创建一个仅包含以下行的.c文件:
_MSC_VER
或
CompilerVersion=_MSC_VER
然后使用
进行预处理cl /nologo /EP <filename>.c
很容易解析输出。
答案 3 :(得分:1)
只是在没有选项的情况下运行它。
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... ]
答案 4 :(得分:1)
和部分&#34; Visual C ++版本号快速参考指南&#34; ...
答案 5 :(得分:-3)
尝试:
cl /v
实际上,每当我给cl一个参数时,它会在第一行打印出版本号。
你可以只给它一个垃圾参数,然后解析输出的第一行,其中包含了版权号。