查找 Microsoft C++ 的版本 从命令行编译器(对于 makefile)
我一定错过了一些非常明显的东西,但由于某种原因,Microsoft C++ 编译器 (cl.exe) 的命令行版本似乎不支持在运行时仅报告其版本。 我们需要它来编写 makefile 来检查我们工具的用户已安装的编译器版本(他们获得包含要在本地编译自己的代码的 makefile,因此我们无法控制他们的编译器版本)。
在 gcc 中,您只需提供选项 -v 或 --version 即可打印出漂亮的版本字符串。
在 cl.exe 中,您会收到 -v 错误。
我已阅读 MSDN 文档和编译器在线帮助,但找不到仅打印编译器版本的开关。 令人烦恼的是,您总是在编译器启动时获得版本...但您似乎无法启动编译器只是为了从中获取版本。
使用 qmake 查找编译器供应商/版本 看起来类似,但只处理简单的问题海湾合作委员会的情况。
我正在尝试使用 VC++ Express 2005,如果这很重要的话。 我希望不会,因为检测编译器版本最好以与编译器版本无关的方式完成:)
回复后更新:
- 在没有任何参数的情况下运行 cl.exe 打印它的版本和一些帮助 文本。
- 这个看起来最像 获取版本的便携方式, 跨vc版本。
- 然后你必须 解析多行输出,但是 并不太难。
- 我们这样做是在 最后,它起作用了。
I must be missing something really obvious, but for some reason, the command-line version of the Microsoft C++ compiler (cl.exe) does not seem to support reporting just its version when run. We need this to write makefiles that check the compiler version a user of our tool has installed (they get makefiles with code they are to compile themselves locally, so we have no control over their compiler version).
In gcc, you just give the option -v or --version to get a nice version string printed.
In cl.exe, you get an error for -v.
I have read the MSDN docs and compiler online help, and I cannot find the switch to just print the compiler version. Annoyingly, you always get the version when the compiler starts... but you seem not to be able to start the compiler just to get the version out of it.
Finding compiler vendor / version using qmake seemed similar, but only deals with the simple case of gcc.
I am trying this with VC++ Express 2005, if that matters. I hoped it would not, as detecting the compiler version is best done in a compiler-version-independent way :)
Update, after replies:
- Running cl.exe without any arguments
prints its version and some help
text. - This looks like the most
portable way to get at the version,
across vc versions. - You then have to
parse a multi-line output, but that
is not too difficult. - We did this in
the end, and it works.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
您确定不能在没有任何输入的情况下运行 cl.exe 来报告其版本吗?
我刚刚测试了在 VS 2008、2005 和 .NET 2003 的命令提示符下运行 cl.exe,它们都报告了其版本。
2008 年:
For 2005, SP 1(添加了安全标准 C++ 类):
For 2005:
对于 .NET 2003:
编辑
对于 2010 年,它将遵循以下原则:
或取决于目标平台
For 2012:
其中 $$$ 是目标平台(例如 x86、x64、ARM),XX、YYYYY 和 ZZ 是次要版本号。
2013 年:
其中 $$$ 是目标平台(例如 x86、x64、ARM),XX、YYYYY 和 ZZ 是次要版本号。
2015 年:
其中 $$$ 是目标平台(例如 x86、x64、ARM),XX 和 YYYYY 是次要版本号。
Are you sure you can't just run cl.exe without any input for it to report its version?
I've just tested running cl.exe in the command prompt for VS 2008, 2005, and .NET 2003 and they all reported its version.
For 2008:
For 2005, SP 1 (added Safe Standard C++ classes):
For 2005:
For .NET 2003:
EDIT
For 2010, it will be along the line of:
or depending on targeted platform
For 2012:
where $$$ is the targeted platform (e.g. x86, x64, ARM), and XX, YYYYY, and ZZ are minor version numbers.
For 2013:
where $$$ is the targeted platform (e.g. x86, x64, ARM), and XX, YYYYY, and ZZ are minor version numbers.
For 2015:
where $$$ is the targeted platform (e.g. x86, x64, ARM), and XX and YYYYY are minor version numbers.
我今天也遇到了同样的问题。 如果 cl 编译器版本是 15,我需要在 nmake Makefile 中设置一个标志。这是我想到的 hack:
请注意,
cl /?
将版本信息打印到标准错误流,并且帮助文本到标准输出。 为了能够使用findstr
命令检查版本,必须首先使用2>&1
将 stderr 重定向到 stdout。上述想法可用于编写一个 Windows 批处理文件,用于检查 cl 编译器版本是否为
<=
给定数字。 以下是 cl_version_LE.bat 的代码:现在,如果您想在 nmake Makefile 中设置一个标志(如果 cl 版本
<=
15),您可以使用:I had the same problem today. I needed to set a flag in a nmake Makefile if the cl compiler version is 15. Here is the hack I came up with:
Note that
cl /?
prints the version information to the standard error stream and the help text to the standard output. To be able to check the version with thefindstr
command one must first redirect stderr to stdout using2>&1
.The above idea can be used to write a Windows batch file that checks if the cl compiler version is
<=
a given number. Here is the code ofcl_version_LE.bat
:Now if you want to set a flag in your nmake Makefile if the cl version
<=
15, you can use:创建一个仅包含以下行的 .c 文件:
或
然后使用 进行预处理。
解析输出很容易。
Create a .c file containing just the line:
or
then pre-process with
It is easy to parse the output.
只需运行它,不带任何选项。
Just run it without options.
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64>cl
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64>cl
查看 C++11 功能(现代 C++)
和“Visual C++ 版本号快速参考指南”部分...
Have a look at C++11 Features (Modern C++)
and section "Quick Reference Guide to Visual C++ Version Numbers" ...
尝试:
实际上,每当我给 cl 一个参数时,它都会在第一行打印出版本号。
您可以只向它提供一个垃圾参数,然后解析输出的第一行,其中包含版本号。
Try:
Actually, any time I give cl an argument, it prints out the version number on the first line.
You could just feed it a garbage argument and then parse the first line of the output, which contains the verison number.