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

时间:2009-08-05 13:37:38

标签: visual-c++ makefile

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

在gcc中,你只需要选择-v或--version来打印一个漂亮的版本字符串。

在cl.exe中,-v会出错。

我已经阅读过MSDN文档和编译器在线帮助,而且我找不到只打印编译器版本的开关。令人讨厌的是,你总是在编译器启动时得到版本......但你似乎无法启动编译器只是为了从中获取版本。

Finding compiler vendor / version using qmake似乎相似,但仅涉及gcc的简单情况。

我正在尝试使用VC ++ Express 2005,如果这很重要的话。我希望它不会,因为检测编译器版本最好以与编译器版本无关的方式完成:)

回复后更新:

  • 运行没有任何参数的cl.exe 打印其版本和一些帮助 文本。
  • 这看起来最像 便携式获取版本, 跨越vc版本。
  • 然后你必须 解析多行输出,但那 并不太难。
  • 我们这样做了 结束,它的确有效。

6 个答案:

答案 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)

查看C++11 Features (Modern C++)

和部分&#34; Visual C ++版本号快速参考指南&#34; ...

答案 5 :(得分:-3)

尝试:

cl /v

实际上,每当我给cl一个参数时,它会在第一行打印出版本号。

你可以只给它一个垃圾参数,然后解析输出的第一行,其中包含了版权号。