2009-08-05 11 views
40

मुझे कुछ वास्तव में स्पष्ट याद आना चाहिए, लेकिन किसी कारण से, Microsoft C++ कंपाइलर (cl.exe) का कमांड-लाइन संस्करण समर्थन नहीं प्रतीत होता है दौड़ते समय बस इसके संस्करण की रिपोर्टिंग। हमें मेकफ़ाइल लिखने की आवश्यकता है जो संकलक संस्करण को हमारे टूल के उपयोगकर्ता को स्थापित कर चुके हैं (वे कोड के साथ मेकफ़ाइल प्राप्त करते हैं जिन्हें वे स्थानीय रूप से संकलित करना चाहते हैं, इसलिए हमारे पास उनके कंपाइलर संस्करण पर कोई नियंत्रण नहीं है)।कमांड लाइन (मेकफ़ाइल के लिए) से Microsoft C++ कंपाइलर का संस्करण ढूँढना

जीसीसी में, आप केवल एक अच्छा संस्करण स्ट्रिंग मुद्रित करने के लिए विकल्प -v या --version देते हैं।

cl.exe में, आपको -v के लिए त्रुटि मिलती है।

मैंने एमएसडीएन दस्तावेज़ और कंपाइलर ऑनलाइन सहायता पढ़ी है, और मुझे बस कंपाइलर संस्करण मुद्रित करने के लिए स्विच नहीं मिल रहा है। कष्टप्रद, जब आप संकलक शुरू होता है तो आपको हमेशा संस्करण मिलता है ... लेकिन आप इसे संस्करण प्राप्त करने के लिए संकलक शुरू करने में सक्षम नहीं होने लगते हैं।

Finding compiler vendor/version using qmake समान लग रहा था, लेकिन केवल जीसीसी के साधारण मामले से संबंधित है।

यदि मैं महत्वपूर्ण हूं, तो मैं वीसी ++ एक्सप्रेस 2005 के साथ यह कोशिश कर रहा हूं। मैं आशा व्यक्त की ऐसा नहीं है, के रूप में संकलक संस्करण का पता लगाने के लिए सबसे अच्छा, एक संकलक संस्करण स्वतंत्र रास्ता :)

अद्यतन में किया जाता है उत्तर के बाद: किसी भी तर्क अपने संस्करण प्रिंट बिना

  • रनिंग cl.exe और कुछ मदद पाठ।
  • यह वीसी संस्करणों में संस्करण, संस्करण पर जाने के लिए सबसे अधिक पोर्टेबल तरीका जैसा दिखता है।
  • तब आपको एक बहु-लाइन आउटपुट पार्स करना है, लेकिन बहुत मुश्किल नहीं है।
  • हमने इसे अंत में किया, और यह काम करता है।

उत्तर

36

क्या आप वाकई cl.exe को इसके संस्करण की रिपोर्ट करने के लिए किसी भी इनपुट के बिना नहीं चला सकते हैं?

मैंने अभी वीएस 2008, 2005 और .NET 2003 के कमांड प्रॉम्प्ट में cl.exe चलाने का परीक्षण किया है और उन सभी ने इसका संस्करण रिपोर्ट किया है।

2008 के लिए:

d: \ Program Files \ Microsoft Visual Studio 9.0 \ कुलपति> सीएल

Microsoft (R) 32-बिट C/C++ अनुकूलन संकलक संस्करण 15.00.30729।के लिए 80x86

2005 के लिए 01, सपा 1 (जोड़ा सुरक्षित स्टैंडर्ड सी ++ वर्ग):

C: \ Program Files \ Microsoft Visual Studio 8 \ कुलपति> सीएल

Microsoft (R) 32-बिट C/C++ अनुकूलन संकलक संस्करण 14.00.50727.762 80x86

2005 के लिए के लिए:

C: \ Program Files \ Microsoft Visual Studio 8 \ कुलपति> सीएल

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

या लक्षित मंच के आधार पर 64 के लिए

Microsoft (R) C/C++ अनुकूलन संकलक संस्करण 16.XX.YYYYY.ZZ

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 (जैसे 86, एक्स 64, एआरएम), और एक्सएक्स और वाई वाई वाईवाई मामूली संस्करण संख्याएं हैं।

+1

हां, इस तरह के काम करता है। लेकिन यह आउटपुट की कुछ अतिरिक्त लाइन भी देता है। मान लीजिए कि हमें जीसीसी के लिए जरूरी है कि हमें कड़ी मेहनत करनी पड़े। – jakobengblom2

+2

यह सही है कि आप केवल 'सीएल' को कॉल कर सकते हैं और आपके पास पार्स किए जाने के लिए उपलब्ध संस्करण होगा, केवल ध्यान दें कि यह वीएस भाषा के साथ बदल जाएगा, उदाहरण के लिए स्पैनिश में वीएस 2010 के लिए आपको 'कंपिलिडोर डी ऑप्टिज़ेसिओन' डी सी/सी ++ डी माइक्रोसॉफ्ट (आर) संस्करण 16.00.30319.01 पैरा x64', मुझे अभी एक महत्वपूर्ण परियोजना (https://jdk8.java.net/) पार्सिंग के माध्यम से संस्करण प्राप्त करने के लिए अंग्रेजी संस्करण में भरोसा है और यह सिर्फ नहीं है ठीक है, क्योंकि यह मेरे स्पेनिश विजुअल स्टूडियो संस्करण –

+0

में काम नहीं करेगा, क्या आप वीएस 10 – TripleS

-3

प्रयास करें:

cl /v 

वास्तव में, किसी भी समय मैं एक तर्क सीएल देते हैं, इसे बाहर पहली पंक्ति पर संस्करण संख्या प्रिंट करता है।

आप इसे सिर्फ एक कचरा तर्क खिला सकते हैं और फिर आउटपुट की पहली पंक्ति का विश्लेषण कर सकते हैं, जिसमें जहर संख्या शामिल है।

+1

जो कि खतरनाक है, क्योंकि/v को बहिष्कृत किया गया है और उसे जोड़ना है उत्पन्न बाइनरी के लिए संस्करण संख्या। यह वह नहीं है जिसे मैं ढूंढ रहा हूं। – jakobengblom2

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

मुझे आज भी यही समस्या थी।

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

ध्यान दें कि cl /? प्रिंट मानक त्रुटि धारा के संस्करण जानकारी और सहायता पाठ: मैं अगर सीएल संकलक संस्करण 15. है यहाँ हैक मैं के साथ आया है एक nmake Makefile में एक ध्वज सेट करने के लिए आवश्यक मानक आउटपुट के लिए। findstr कमांड के साथ संस्करण को जांचने में सक्षम होने के लिए पहले किसी को 2>&1 का उपयोग करके stdr पर stderr को रीडायरेक्ट करना होगा।

उपरोक्त विचार का उपयोग विंडोज बैच फ़ाइल लिखने के लिए किया जा सकता है जो जांचता है कि सीएल कंपाइलर संस्करण <= किसी दिए गए नंबर पर है या नहीं।

@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 में एक ध्वज सेट करने के लिए करता है, तो सीएल संस्करण <= 15, आप उपयोग कर सकते हैं चाहते हैं::

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

यह जानने के लिए उपयोगी है कि हेडर वास्तव में stdout की बजाय stderr पर मुद्रित किया जा रहा है। – kevinmm

1

एक नज़र C++11 Features (Modern C++)

पर यहाँ cl_version_LE.bat का कोड है

और अनुभाग "दृश्य सी ++ संस्करण संख्याओं के लिए त्वरित संदर्भ मार्गदर्शिका" ...

+0

'nmake' के भीतर से * "विजुअल सी ++ संस्करण संख्या" * का उपयोग कैसे करता है? * "_MSC_VER' संस्करण संख्या" * स्रोत फ़ाइलों के लिए ठीक है, लेकिन यह स्पष्ट नहीं है कि मेकफ़ाइल के लिए यह कैसे उपयोगी है। * "ब्रांडेड संस्करण संख्या" * और * "आंतरिक संस्करण संख्या" * कम उपयोगी लगती है। – jww

संबंधित मुद्दे