2009-08-05 206 views
40

我必須缺少一些非常明顯的東西,但出於某種原因,Microsoft C++編譯器(cl.exe)的命令行版本似乎不支持報告運行時的版本。我們需要編寫這樣的makefile來檢查我們工具的用戶已經安裝的編譯器版本(他們獲得帶有代碼的makefile,它們將在本地編譯,因此我們無法控制它們的編譯器版本)。從命令行查找版本的Microsoft C++編譯器(for makefiles)

在gcc中,您只需提供選項-v或--version即可獲得打印的良好版本字符串。

在cl.exe中,出現-v錯誤。

我已閱讀MSDN文檔和編譯器聯機幫助,並且找不到打印編譯器版本的開關。令人煩惱的是,編譯器啓動時總會得到版本......但似乎無法啓動編譯器只是爲了從版本中獲取版本。

Finding compiler vendor/version using qmake看起來很相似,但只處理gcc的簡單情況。

我試圖用VC++ Express 2005,如果這件事。我希望它不會,因爲檢測編譯器版本是在編譯器版本無關的方式:)

更新,這樣做可以回覆後:

  • 運行cl.exe時沒有 打印其版本的任何參數有些幫助 文字。
  • 這看起來像是最簡單的 便攜式版本,可以跨越vc版本獲得 版本。
  • 然後你必須 解析一個多行輸出,但是這個 不是太難。
  • 我們在 的末尾做了這個,它工作。

回答

36

您確定無法運行cl.exe而無需任何輸入以報告其版本嗎?

我剛剛在VS 2008,2005和.NET 2003的命令提示符下測試了運行cl.exe,它們都報告了它的版本。

對於2008:

d:\程序Files \ Microsoft的Visual Studio 9.0 \ VC> CL

微軟(R)32位C/C++優化編譯器版15.00.30729。01爲80×86

2005年,SP 1(加入的安全標準C++類):

C:\程序Files \ Microsoft的Visual Studio 8 \ VC> CL

微軟(R) 32位C/C++優化編譯器版14.00.50727.762爲80x86的

對於2005:

C:\程序Files \ Microsoft的Visual Studio 8 \ VC> CL

微軟(R)32位C/C++優化編譯器版14.00.50727.42爲80x86的

對於.NET 2003:

微軟(R)32位C/C++編譯器優化版本13.10.6030爲80x86的

EDIT

對於2010年,這將是沿着線:

微軟(R)32位C/C++優化編譯器版16.XX.YYYYY.ZZ爲80x86的

或取決於目標平臺

微軟(R)C/C++優化編譯器版16.XX.YYYYY.ZZ針對x64

對於2012:

微軟(R)C/C++優化編譯器版17.XX.YYYYY.ZZ爲$$$

其中$$$是目標平臺(例如x86,x64,ARM)和XX,YYYYY和ZZ是次要版本號。

對於2013:

微軟(R)C/C++優化編譯器版18.XX.YYYYY.ZZ爲$$$

其中$$$是目標平臺(例如x86,x64,ARM)和XX,YYYYY和ZZ是次要版本號。

對於2015:

微軟(R)C/C++優化編譯器版19.XX.YYYYY爲$$$

其中$$$是目標平臺(例如X86, x64,ARM)以及XX和YYYYY是次要版本號。

+1

是的,那種作品。但它也提供了一些額外的輸出。猜猜我們只需要比我們必須解析gcc更困難。 – jakobengblom2 2009-08-05 13:57:07

+2

這是正確的,你可以調用'cl',你將有可用的版本進行解析,只要考慮到它會改變與VS語言,例如對於VS 2010西班牙語,你會得到'Compilador deoptimización de C/C++ de Microsoft(R)versión16.00.30319.01 para x64',我剛剛發現一個重要的項目(https://jdk8.java.net/)依靠英文版來獲取解析版本,而這不是正確的,因爲它不會在我的西班牙語Visual Studio版本 – 2014-04-12 03:29:52

+0

工作,你可以請更新VS 10 – TripleS 2014-04-24 13:39:33

-3

嘗試:

cl /v 

其實,任何時候我給CL參數,它打印出的第一行的版本號。

你可以給它一個垃圾參數,然後解析包含verison數字的輸出的第一行。

+1

這是徹頭徹尾的危險,因爲/ v已棄用,應該添加版本號到生成的二進制文件。這不是我正在尋找的。 – jakobengblom2 2009-08-05 13:57:41

1

只需運行它沒有選項。

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

今天我有同樣的問題。我需要設置一個標誌,在NMAKE Makefile文件,如果CL編譯器的版本是15.這是我想出了破解:

!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 
+1

有用的是知道標題實際上是打印到標準錯誤,而不是標準輸出。 – kevinmm 2014-01-09 01:04:43

1

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

和「Visual C++版本號快速參考指南」部分...

+0

如何在'nmake'內使用*「Visual C++版本號」*? *「'_MSC_VER'版本號」*對於源文件很好,但不清楚它如何對makefile有用。 *「品牌版本號」*和*「內部版本號」*似乎更沒有用。 – jww 2016-09-07 23:10:28