Поиск версии компилятора Microsoft C ++ из командной строки (для make-файлов) - PullRequest
47 голосов
/ 05 августа 2009

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

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

В cl.exe вы получаете ошибку для -v.

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

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

Я пытаюсь сделать это с VC ++ Express 2005, если это имеет значение. Я надеялся, что этого не произойдет, так как определение версии компилятора лучше всего делать независимо от версии компилятора :)

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

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

Ответы [ 6 ]

37 голосов
/ 05 августа 2009

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

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

за 2008 г .:

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

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

Для 2005 года, SP 1 (добавлены классы Safe Standard C ++):

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

32-разрядный оптимизирующий компилятор C / C ++ Microsoft (R) версии 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

EDIT

В 2010 году оно будет соответствовать:

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

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

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

На 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 - второстепенные номера версий.

9 голосов
/ 26 сентября 2012

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

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

Обратите внимание, что cl /? выводит информацию о версии в стандартный поток ошибок и текст справки в стандартный вывод. Чтобы иметь возможность проверить версию с помощью команды findstr, необходимо сначала перенаправить stderr на стандартный вывод, используя 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
2 голосов
/ 30 августа 2018

Создайте файл .c, содержащий только строку:

_MSC_VER

или

CompilerVersion=_MSC_VER

затем предварительно обработайте с

cl /nologo /EP <filename>.c

Легко разобрать вывод.

1 голос
/ 21 января 2015

Посмотрите на Особенности C ++ 11 (Modern C ++)

и раздел «Краткое справочное руководство по номерам версий Visual C ++» ...

1 голос
/ 05 августа 2009

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

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... ]
0 голосов
/ 05 августа 2009

Попробуйте:

cl /v

На самом деле, каждый раз, когда я даю cl аргументу, он печатает номер версии в первой строке.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...