【问题标题】:Finding version of Microsoft C++ compiler from command-line (for makefiles)从命令行查找 Microsoft C++ 编译器的版本(用于生成文件)
【发布时间】:2010-11-17 00:38:19
【问题描述】:

我肯定遗漏了一些非常明显的东西,但由于某种原因,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版本。
  • 然后你必须 解析多行输出,但是 不是太难。
  • 我们在 结束,它起作用了。

【问题讨论】:

标签: visual-c++ makefile


【解决方案1】:

试试:

cl /v

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

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

【讨论】:

  • 这是非常危险的,因为 /v 已被弃用,并且应该向生成的二进制文件添加版本号。这不是我要找的。​​span>
【解决方案2】:

您确定不能在没有任何输入的情况下运行 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 用于 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 用于 80x86

对于 .NET 2003:

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

编辑

对于 2010 年,它将沿着:

Microsoft (R) 32 位 C/C++ 优化编译器版本 16.XX.YYYYY.ZZ 用于 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 是次要版本号。

【讨论】:

  • 是的,那样的作品。但它也提供了一些额外的输出行。猜猜我们只需要比 gcc 更难的解析。
  • 这是正确的,您只需调用cl,您就可以在那里解析版本,只要考虑到它会随着VS语言而改变,例如西班牙语的VS 2010你会得到Compilador de optimización de C/C++ de Microsoft (R) versión 16.00.30319.01 para x64,我刚刚发现一个重要的项目(jdk8.java.net)依赖英文版通过解析获取版本,这是不对的,因为它不适用于我的西班牙语 Visual Studio 版本
  • @TripleS 你去吧。
  • VS2017 据称添加了 ARMv8 (ARM64)。但我can't figure out how to engage it。我已经准备好为 MS IoT 小工具启用 ARMv8 代码......微软缺乏文档非常令人沮丧。
  • 对于 VS2017,cl.exe (可能)在 C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.XX.XXXXX\bin\ Hostx64\x64(注意 X,这取决于您的 MSVC++ 编译器版本)。
【解决方案3】:

不带选项直接运行。

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】:

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

    【讨论】:

    • 有助于知道标题实际上是打印到标准错误,而不是标准输出。
    【解决方案5】:

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

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

    【讨论】:

    • 如何在nmake 中使用"Visual C++ 版本号""_MSC_VER version number" 适用于源文件,但不清楚它对 makefile 有什么用处。 “品牌版本号”“内部版本号”似乎更没用了。
    【解决方案6】:

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

    _MSC_VER
    

    CompilerVersion=_MSC_VER
    

    然后进行预处理

    cl /nologo /EP <filename>.c
    

    解析输出很容易。

    【讨论】:

      【解决方案7】:

      C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64>cl

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        • 2017-03-04
        • 1970-01-01
        • 2019-06-15
        • 2018-05-17
        相关资源
        最近更新 更多