Подтвердить что ты не робот

Поиск версии компилятора Microsoft С++ из командной строки (для make файлов)

Мне нужно пропустить что-то действительно очевидное, но по какой-то причине версия командной строки компилятора Microsoft С++ (cl.exe) не поддерживает отчетность только своей версии при запуске. Нам нужно это, чтобы написать make файлы, которые проверяют версию компилятора, которую установил пользователь нашего инструмента (они получают make файлы с кодом, который они должны компилировать локально, поэтому мы не контролируем их версию компилятора).

В gcc вы просто передадите опцию -v или --version, чтобы получить красивую строку с версией.

В cl.exe вы получите сообщение об ошибке -v.

Я прочитал интерактивную справку MSDN docs и компилятора, и я не могу найти переключатель, чтобы просто распечатать версию компилятора. Раздражающе, вы всегда получаете версию, когда компилятор запускается... но вы, похоже, не можете запустить компилятор, чтобы получить версию.

Поиск поставщика/версии компилятора с использованием qmake показался похожим, но касается только простого случая gcc.

Я пробую это с VС++ Express 2005, если это имеет значение. Я надеялся, что этого не произойдет, так как обнаружение версии компилятора лучше всего сделать не зависящим от компилятора способом:

Обновление после ответов:

  • Запуск cl.exe без каких-либо аргументов печатает свою версию и некоторую помощь текст.
  • Это выглядит как наиболее портативный способ получить версию, версии vc.
  • Затем вы должны проанализировать многострочный вывод, но не слишком сложно.
  • Мы сделали это в конец, и он работает.
4b9b3361

Ответ 1

Вы уверены, что не можете просто запустить cl.exe без каких-либо сообщений, чтобы сообщить о своей версии?

Я только что протестировал запуск cl.exe в командной строке для VS 2008, 2005 и .NET 2003, и все они сообщили о своей версии.

В 2008 году:

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

Microsoft (R) 32-разрядная версия оптимизатора для C/С++ версии 15.00.30729.01 для 80x86

В 2005 году SP 1 (добавлены классы безопасного стандарта С++):

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

Microsoft (R) 32-разрядный оптимизатор компилятора C/С++ версии 14.00.50727.762 для 80x86

За 2005 год:

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

Microsoft (R) 32-разрядная оптимизация компилятора C/С++ версии 14.00.50727.42 для 80x86

Для .NET 2003:

Microsoft (R) 32-разрядный оптимизатор компилятора C/С++ версии 13.10.6030 для 80x86

ИЗМЕНИТЬ

В течение 2010 года он будет по линии:

Microsoft (R) 32-разрядная оптимизация компилятора C/С++ версии 16.XX.YYYYY.ZZ для 80x86

или в зависимости от целевой платформы

Microsoft (R) C/С++ Оптимизация компилятора версии 16.XX.YYYYY.ZZ для x64

В 2012 году:

Microsoft (R) C/С++ Оптимизация компилятора Версия 17.XX.YYYYY.ZZ для $$$

где $$$ - целевая платформа (например, x86, x64, ARM) и XX, YYYYY и ZZ - это небольшие номера версий.

В 2013 году:

Microsoft (R) C/С++ Оптимизация компилятора Версия 18.XX.YYYYY.ZZ для $$$

где $$$ - целевая платформа (например, x86, x64, ARM) и XX, YYYYY и ZZ - это небольшие номера версий.

В течение 2015 года:

Microsoft (R) C/С++ Оптимизация компилятора версии 19.XX.YYYYY для $$$

где $$$ - целевая платформа (например, x86, x64, ARM), а XX и YYYYY - младшие номера версий.

Ответ 2

У меня была такая же проблема сегодня. Мне нужно было установить флаг в makefile makefile, если версия компилятора cl равна 15. Вот взлом, который я придумал:

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

Обратите внимание, что 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

Теперь, если вы хотите установить флаг в файле makefile nmake, если версия cl <= 15, вы можете использовать:

!IF [cl_version_LE.bat 15]
FLAG = "cl version <= 15"
!ENDIF

Ответ 4

Просто запустите его без параметров.

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

Ответ 5

Try:

cl /v

Собственно, в любое время, когда я даю cl аргумент, он выводит номер версии в первой строке.

Вы можете просто передать ему аргумент мусора, а затем проанализировать первую строку вывода, содержащую номер проверки.