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

发布于 2024-07-30 09:16:16 字数 787 浏览 2 评论 0原文

我一定错过了一些非常明显的东西,但由于某种原因,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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

剧终人散尽 2024-08-06 09:16:17

您确定不能在没有任何输入的情况下运行 cl.exe 来报告其版本吗?

我刚刚测试了在 VS 2008、2005 和 .NET 2003 的命令提示符下运行 cl.exe,它们都报告了其版本。

2008 年:

d:\Program Files\Microsoft Visual Studio 9.0\VC>cl

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

For 2005, SP 1(添加了安全标准 C++ 类):

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

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

For 2005:

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

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

对于 .NET 2003:

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

编辑

对于 2010 年,它将遵循以下原则:

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

或取决于目标平台

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

For 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 是次要版本号。

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:

d:\Program Files\Microsoft Visual Studio 9.0\VC>cl

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86

For 2005, SP 1 (added Safe Standard C++ classes):

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

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86

For 2005:

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

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86

For .NET 2003:

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.6030 for 80x86

EDIT

For 2010, it will be along the line of:

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.XX.YYYYY.ZZ for 80x86

or depending on targeted platform

Microsoft (R) C/C++ Optimizing Compiler Version 16.XX.YYYYY.ZZ for x64

For 2012:

Microsoft (R) C/C++ Optimizing Compiler Version 17.XX.YYYYY.ZZ for $$$

where $$$ is the targeted platform (e.g. x86, x64, ARM), and XX, YYYYY, and ZZ are minor version numbers.

For 2013:

Microsoft (R) C/C++ Optimizing Compiler Version 18.XX.YYYYY.ZZ for $$$

where $$$ is the targeted platform (e.g. x86, x64, ARM), and XX, YYYYY, and ZZ are minor version numbers.

For 2015:

Microsoft (R) C/C++ Optimizing Compiler Version 19.XX.YYYYY for $$$

where $$$ is the targeted platform (e.g. x86, x64, ARM), and XX and YYYYY are minor version numbers.

一刻暧昧 2024-08-06 09:16:17

我今天也遇到了同样的问题。 如果 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

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:

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

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 the findstr command one must first redirect stderr to stdout using 2>&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 of 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

Now if you want to set a flag in your nmake Makefile if the cl version <= 15, you can use:

!IF [cl_version_LE.bat 15]
FLAG = "cl version <= 15"
!ENDIF
黒涩兲箜 2024-08-06 09:16:17

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

_MSC_VER

CompilerVersion=_MSC_VER

然后使用 进行预处理。

cl /nologo /EP <filename>.c

解析输出很容易。

Create a .c file containing just the line:

_MSC_VER

or

CompilerVersion=_MSC_VER

then pre-process with

cl /nologo /EP <filename>.c

It is easy to parse the output.

鼻尖触碰 2024-08-06 09:16:17

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

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... ]

Just run it without options.

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... ]
套路撩心 2024-08-06 09:16:17

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

寄意 2024-08-06 09:16:17

查看 C++11 功能(现代 C++)

和“Visual C++ 版本号快速参考指南”部分...

Have a look at C++11 Features (Modern C++)

and section "Quick Reference Guide to Visual C++ Version Numbers" ...

恍梦境° 2024-08-06 09:16:17

尝试:

cl /v

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

您可以只向它提供一个垃圾参数,然后解析输出的第一行,其中包含版本号。

Try:

cl /v

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文