Поиск версии компилятора Microsoft С++ из командной строки (для make файлов)
Мне нужно пропустить что-то действительно очевидное, но по какой-то причине версия командной строки компилятора Microsoft С++ (cl.exe) не поддерживает отчетность только своей версии при запуске. Нам нужно это, чтобы написать make файлы, которые проверяют версию компилятора, которую установил пользователь нашего инструмента (они получают make файлы с кодом, который они должны компилировать локально, поэтому мы не контролируем их версию компилятора).
В gcc вы просто передадите опцию -v или --version, чтобы получить красивую строку с версией.
В cl.exe вы получите сообщение об ошибке -v.
Я прочитал интерактивную справку MSDN docs и компилятора, и я не могу найти переключатель, чтобы просто распечатать версию компилятора. Раздражающе, вы всегда получаете версию, когда компилятор запускается... но вы, похоже, не можете запустить компилятор, чтобы получить версию.
Поиск поставщика/версии компилятора с использованием qmake показался похожим, но касается только простого случая gcc.
Я пробую это с VС++ Express 2005, если это имеет значение. Я надеялся, что этого не произойдет, так как обнаружение версии компилятора лучше всего сделать не зависящим от компилятора способом:
Обновление после ответов:
- Запуск cl.exe без каких-либо аргументов
печатает свою версию и некоторую помощь
текст.
- Это выглядит как наиболее
портативный способ получить версию,
версии vc.
- Затем вы должны
проанализировать многострочный вывод, но
не слишком сложно.
- Мы сделали это в
конец, и он работает.
Ответы
Ответ 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
Ответ 3
Посмотрите Возможности С++ 11 (современный С++)
и раздел "Краткое справочное руководство по номерам версий Visual С++"...
Ответ 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 аргумент, он выводит номер версии в первой строке.
Вы можете просто передать ему аргумент мусора, а затем проанализировать первую строку вывода, содержащую номер проверки.