qmake

2009-04-29 13 views
9

का उपयोग कर कंपाइलर विक्रेता/संस्करण ढूँढना क्या उपयोगकर्ता द्वारा qmake के माध्यम से उपयोग किए गए कंपाइलर के संस्करण और विक्रेता को प्राप्त करने का कोई तरीका है? मुझे इसकी आवश्यकता है कि मेरे प्रोजेक्ट के कुछ लक्ष्य बनाने को अक्षम करें जब g ++ 3.x का उपयोग किया जाता है और g ++ 4.x का उपयोग होने पर उन्हें सक्षम किया जाता है।qmake

अद्यतन: अधिकांश उत्तरों ने प्रीप्रोसेसर को लक्षित किया। यह ऐसा कुछ है जिसे मैं टालना चाहता हूं। मैं एक विशिष्ट संकलक संस्करण के लिए एक लक्ष्य बनाना नहीं चाहता हूं और मैं बिल्ड सिस्टम द्वारा यह निर्णय लेना चाहता हूं।

उत्तर

13

इसके अलावा ashcatch करने के जवाब है, qmakequery the command line और प्राप्त करने के लिए आप की अनुमति देता है प्रतिक्रिया एक चर के रूप में वापस। तो अगर आप कुछ इस स्वरूप में हो सकते हैं:

linux-g++ { 
    system(g++ --version | grep -e "\<4.[0-9]") { 
     message("g++ version 4.x found") 
     CONFIG += g++4 
    } 
    else system(g++ --version | grep -e "\<3.[0-9]") { 
     message("g++ version 3.x found") 
     CONFIG += g++3 
    } 
    else { 
     error("Unknown system/compiler configuration") 
    } 
} 
बाद में

फिर, जब आप लक्ष्यों को निर्दिष्ट करने के लिए इसका इस्तेमाल करना चाहते हैं, तो आप config scoping नियमों का उपयोग कर सकते हैं:

SOURCES += blah blah2 blah3 
g++4: SOURCES += blah4 blah5 
+0

परफेक्ट धन्यवाद $$ का उपयोग प्रमुख संस्करण संख्या निकाल सकते हैं। मैं ऐसा कुछ करने पर सोच रहा था लेकिन सोचा कि मैं पूछूंगा कि क्या ऐसा कुछ है जो पहले ही बॉक्स से बाहर है। चूंकि वहां स्पष्ट रूप से आपका समाधान उपयोग करने के लिए तैयार नहीं है :-) –

+0

@ कैलेब: यदि आप 'gcc -dumpversion' कमांड का उपयोग करेंगे, तो एक संभावित सरलीकरण है, जो grep को अनावश्यक बना सकता है। क्या मैं आपका जवाब संपादित कर सकता हूं या क्या मैं एक और लिखूंगा? – user23573

+0

@BogdanWilli मुफ्त महसूस करें। –

0

प्रत्येक कंपाइलर विक्रेता कुछ विशिष्ट प्रतीकों को परिभाषित करने के लिए उपयोग करता है जो संकलक और संस्करण की पहचान करते हैं। आप उन प्रतीकों का उपयोग करके चेक कर सकते हैं।

मुझे पता है, उदाहरण के लिए, _MSC_VER माइक्रोसॉफ़्ट सी ++ कंपाइलर का संस्करण देता है।

मुझे यह भी पता है कि बूस्ट लाइब्रेरी इस प्रकार के फीचर चयन और अनुकूलन का उपयोग करते हैं।

आप बूस्ट कॉन्फ़िगर हेडर को देखने के लिए देख सकते हैं, जिसमें पथ शामिल हैं: boost/config/*, विशेष रूप से select_compiler_config.hpp पर।

उन कंपाइलर विशिष्ट प्रतीकों का उपयोग करके, आप कोड बनाने के प्रीप्रोसेसिंग चरण में सुविधा चयन कर सकते हैं।

2

एक शुरुआत के रूप में, मैं scoping विशेषता यह है कि समर्थन करता है qmake पर दिखेगा:

Scopes and Conditions

लेकिन जब मैं इसके बारे में पढ़ा है, ऐसा लगता है कि डिफ़ॉल्ट रूप से आप win32 या unix की तरह सामान्य मंच की स्थिति का उपयोग कर सकते या आप linux-g++ जैसे qmake spec के नाम का उपयोग कर सकते हैं। आप इस तरह के विजुअल स्टूडियो संस्करण का परीक्षण कर सकते हैं (क्योंकि विभिन्न विजुअल स्टूडियो संस्करण अलग-अलग qmake चश्मे का उपयोग करते हैं), लेकिन मुझे नहीं लगता कि आप इस तरह के जीसीसी संस्करण का परीक्षण कर सकते हैं (कम से कम मुझे नहीं पता कि कैसे)।

0

निम्नलिखित मैक्रो जीसीसी और जी ++

#define __GNUC__ 4 
#define __GNUC_MINOR__ 0 
#define __GNUC_PATCHLEVEL__ 1 

की मेरी संस्करण में परिभाषित कर रहे हैं Additionaly जी ++ परिभाषित करता है:

#define __GNUG__ 4 
1

मुझे क्या करना

isEmpty(MGWVER) { 
    MGW_MAJ = $$system(echo | gcc -dM -E - | fgrep __GNUC__ | cut -d\" \" -f 3) 
    MGW_MIN = $$system(echo | gcc -dM -E - | fgrep __GNUC_MINOR__ | cut -d\" \" -f 3) 
    MGWVER =$$MGW_MAJ$$MGW_MIN 
    message(MGWVER $$MGWVER) 
} 

यह "48" देता है। मैं उचित बढ़ावा पुस्तकालयों को जोड़ने के लिए इसका इस्तेमाल करते हैं:

USER_BOOST_CFG=mgw$${MGWVER}-mt-s-$$(BOOST_VER) 
message($$USER_BOOST_CFG) 
LIBS *= -L$$(BOOST_ROOT)/lib 
LIBS *= -L$$(BOOST_ROOT)/stage/lib 

LIBS *= -lboost_system-$$USER_BOOST_CFG 
LIBS *= -lboost_filesystem-$$USER_BOOST_CFG 
LIBS *= -lboost_date_time-$$USER_BOOST_CFG 

प्रभावी ढंग से दे रही है: -lboost_system-mgw48-MT-स-1_54

मैं MinGW पर कर रहा हूँ।

message(QMAKESPEC $$QMAKESPEC) 
SPLITED=$$section(QMAKESPEC, "/", 0, -3) 
message(SPLITED $$SPLITED) 
+0

यह क्यूटी 5.4 पर काम नहीं करता है (चयनित किट: डेस्कटॉप क्यूटी 5.4.1 मिनजीडब्लू 32 बिट) 'fgrep' उपलब्ध नहीं है। – user23573

+0

fgrep qt का हिस्सा नहीं है। आपको http://gnuwin32.sourceforge.net/ की आवश्यकता है। मैं https://chocolatey.org/ इंस्टॉल करने और 'choco install gnuwin' की स्थापना करने की सिफारिश करता हूं। कमांड लाइन या स्क्रिप्ट से सबकुछ – fantastory

3

मेरा जवाब Caleb Huitt - cjhuitt के आधार पर:

एक और विचार है, संकेत QMAKESPEC vaariable को देखो और इसे से पार्स करने के लिए है। लेकिन उनका दृष्टिकोण मेरे लिए काम नहीं करता है।

*-g++ { 
    GCC_VERSION = $$system("g++ -dumpversion") 
    contains(GCC_VERSION, 6.[0-9]) { 
     message("g++ version 6.x found") 
     CONFIG += g++6 
    } else { 
     contains(GCC_VERSION, 5.[0-9]) { 
      message("g++ version 5.x found") 
      CONFIG += g++5 
     } else { 
      contains(GCC_VERSION, 4.[0-9]) { 
       message("g++ version 4.x found") 
       CONFIG += g++4 
      } else { 
       message("Unknown GCC configuration") 
      } 
     } 
    } 
} 

जैसा कि आप देखते हैं कि आप जीसीसी से संस्करण प्राप्त कर सकते हैं और फिर इसे रेगेक्स अभिव्यक्ति के साथ तुलना कर सकते हैं।

तरह से कैसे उपयोग करने के लिए एक ही है:

SOURCES += blah blah2 blah3 
g++4: SOURCES += blah4 blah5 
0

मेरा जवाब dismine's answer
पर आधारित है हम तो बस str_member

gcc | clang { 
    COMPILER_VERSION = $$system($$QMAKE_CXX " -dumpversion") 
    COMPILER_MAJOR_VERSION = $$str_member($$COMPILER_VERSION) 
    greaterThan(COMPILER_MAJOR_VERSION, 3): message("gcc 4 or later") 
    greaterThan(COMPILER_MAJOR_VERSION, 4): message("gcc 5 or later") 
    greaterThan(COMPILER_MAJOR_VERSION, 5): message("gcc 6 or later") 
    greaterThan(COMPILER_MAJOR_VERSION, 6): message("gcc 7 or later") 
} 
संबंधित मुद्दे