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

jak*_*om2 49 makefile visual-c++

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

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

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

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

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

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

回复后更新:

  • 运行不带任何参数的cl.exe会打印其版本和一些帮助文本.
  • 这看起来是跨越vc版本获得该版本的最便携方式.
  • 然后你必须解析多行输出,但这并不太难.
  • 我们最终做到了这一点,并且它有效.

KTC*_*KTC 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

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

2005年:

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

用于80x86的Microsoft(R)32位C/C++优化编译器版本14.00.50727.42

对于.NET 2003:

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

编辑

对于2010年,它将沿着以下方向:

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

或取决于目标平台

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

2012年:

用于$$$的Microsoft(R)C/C++优化编译器版本17.XX.YYYYY.ZZ

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

2013年:

用于$$$的Microsoft(R)C/C++优化编译器版本18.XX.YYYYY.ZZ

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

2015年:

用于$$$的Microsoft(R)C/C++优化编译器版本19.XX.YYYYY

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

  • 这是正确的,你可以调用`cl`,你可以在那里解析它的版本,只要考虑到它会随着VS语言改变,例如对于西班牙语的VS 2010,你会得到`Compiladordeoptimizaciónde C/C++ de Microsoft(R)versión16.00.30319.01para x64`,我刚刚发现了一个重要的项目(https://jdk8.java.net/)依赖于英文版来获得通过解析的版本,这只是不对,因为它不适用于我的西班牙语Visual Studio版本 (3认同)

Lin*_*umz 9

我今天遇到了同样的问题.如果cl编译器版本是15,我需要在nmake Makefile中设置一个标志.这是我提出的hack:

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

请注意,cl /?将版本信息打印到标准错误流,将帮助文本打印到标准输出.为了能够使用findstr命令检查版本,必须先将stderr重定向到stdout 2>&1.

上述想法可用于编写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
Run Code Online (Sandbox Code Playgroud)

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

!IF [cl_version_LE.bat 15]
FLAG = "cl version <= 15"
!ENDIF
Run Code Online (Sandbox Code Playgroud)


小智 9

创建一个仅包含以下行的 .c 文件:

_MSC_VER
Run Code Online (Sandbox Code Playgroud)

或者

CompilerVersion=_MSC_VER
Run Code Online (Sandbox Code Playgroud)

然后预处理

cl /nologo /EP <filename>.c
Run Code Online (Sandbox Code Playgroud)

解析输出很容易。


Mar*_*ark 5

只需运行它,不带任何选项。

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... ]
Run Code Online (Sandbox Code Playgroud)