2013-06-06 4 views
31

की व्याख्या कैसे करता है मैंने HERE पढ़ा है, फिर भी मुझे qmake CONFIG चर के सिंटैक्स को समझ में नहीं आता है। उदाहरण के लिए, अगर मैं अपने .pro file में निम्नलिखित कॉन्फ़िगरेशन सेटिंग है:qMake: qmake वास्तव में "CONFIG (डीबग, डीबग | रिलीज)" वाक्यविन्यास

Project MESSAGE: debug mode 
Project MESSAGE: debug mode 
Project MESSAGE: release mode 

जानते हुए भी कि:

CONFIG(debug, debug|release) { 
    message("debug mode") 
}else { 
    message("release mode") 
} 

तब, जब qmake चल रहा है, निम्नलिखित क्यूटी-निर्माता में संकलित आउटपुट में प्रदर्शित किया जाएगा मैं एक "डिबग मोड" में अपने प्रोजेक्ट का निर्माण कर रहा हूँ, तो मेरे सवाल कर रहे हैं:

  • क्यों "डीबग मोड" संदेश नहीं दिखा रहा है केवल? और यह सिर्फ एक बार क्यों नहीं दिख रहा है?
  • फिर, चूंकि मैं "डीबग मोड" में निर्माण कर रहा हूं, संदेश "प्रोजेक्ट संदेश: रिलीज़ मोड" क्यों प्रदर्शित होता है?
  • बिल्कुल, वाक्यविन्यास क्या है: CONFIG (डीबग, डीबग | रिलीज) वास्तव में इसका मतलब है? क्या इसका मतलब है कि डीबग मोड में निर्माण करना, फिर एक डीबग मोड में बनाना और आखिरकार रिलीज मोड में बनाना? मुझे पता है कि इन ब्रैकेट्स "{}" का अर्थ scope है, लेकिन इन ब्रैकेट्स "()" के अंदर क्या है, इसकी व्याख्या कैसे करें?

उत्तर

51

आपके द्वारा लिंक किए गए आलेख में, यह बहुत शुरुआत में कहा गया है कि परियोजना फ़ाइल को तीन बार संसाधित किया जाता है। यह आपके पहले प्रश्न का उत्तर देना चाहिए; चूंकि इसे तीन बार संसाधित किया जाता है, इसलिए आपका संदेश() तीन बार भी निष्पादित होता है। यह कई बार संसाधित क्यों किया जाता है? क्योंकि qmake आपकी परियोजना का निर्माण नहीं करता है! यह केवल निर्माण निर्देश उत्पन्न करता है जिसका उपयोग वास्तव में प्रोजेक्ट बनाने के लिए किया जाता है। सभी संभावित कॉन्फ़िगरेशन के लिए निर्माण निर्देश उत्पन्न करने के लिए, प्रत्येक प्रोजेक्ट के लिए एक बार प्रोजेक्ट फ़ाइल को कई बार संसाधित करने की आवश्यकता होती है।

अपने दूसरे प्रश्न के लिए: आपकी परियोजना केवल डीबग मोड में बनाई गई है, यदि आपने यही चुना है, लेकिन रिलीज मोड के लिए निर्देश भी बनाए गए हैं, जैसा कि ऊपर उल्लिखित है। उदाहरण के लिए "मेक" के साथ "मेक" का उपयोग करते समय (विजुअल स्टूडियो की बजाय), आपको दो मेकफ़ाइल मिलते हैं: Makefile.Release और Makefile.Debug। जब यह रिलीज मेकफ़ाइल उत्पन्न करता है, तब जब "रिलीज़ मोड" मुद्रित होता है।

अंत में, CONFIG(debug, debug|release) सच में मूल्यांकन करता है अगर CONFIG में "डीबग" है लेकिन "रिलीज़" नहीं है, या यदि इसमें "डीबग" और "रिलीज़" दोनों शामिल हैं लेकिन "रिलीज" "डीबग" की अंतिम घटना के बाद प्रकट नहीं होता है । के बाद से पिछले "डिबग" पिछले "रिलीज" के बाद आती

CONFIG += release debug release debug release debug 

, CONFIG(debug, debug|release) सत्य है: उदाहरण के लिए आप इस हो सकता है।

CONFIG() (इस मामले में "डीबग") का पहला तर्क वह मान है जो अंतिम रूप से दिखाना है। दूसरा तर्क ("डीबग | रिलीज") उन मानों का सेट है जो पहले तर्क की जांच की जाती हैं।

अंग्रेजी में अनुवाद करना इस तरह कुछ देगा: यदि "डेबग" कम से कम एक बार प्रकट होता है तो सत्य का मूल्यांकन करें और यदि "रिलीज" भी दिखाई देता है, तो "डीबग" की अंतिम उपस्थिति "रिलीज" की आखिरी उपस्थिति के बाद आता है "।

+3

आपके उत्तर के लिए बहुत बहुत धन्यवाद, यह बेहद महत्वपूर्ण और सहायक है। हालांकि, मुझे "कथन मूल्यांकन" के हिस्से को समझ में नहीं आया।आपने उल्लेख किया है कि "CONFIG (डीबग, डीबग | रिलीज) 'सच में मूल्यांकन करता है यदि CONFIG में डीबग इत्यादि शामिल है ...", "इसमें" का क्या अर्थ है? क्या आपका मतलब है 'कॉन्फिग + = डीबग' में परिभाषित किया गया है? यदि हां, तो मेरे पास मेरी '.pro फ़ाइल' में ऐसी कोई परिभाषा नहीं है, फिर यह परिभाषा कहां स्थित है? .. एक और बात, आपने यह भी परिभाषित किया: 'CONFIG + = रिलीज डीबग रिलीज डीबग रिलीज डीबग', इस तरह "डीबग" और "रिलीज" को परिभाषित करने का क्या अर्थ है? – hashDefine

+0

कृपया, मेरे बहुत सारे प्रश्नों को क्षमा करें क्योंकि मुझे नहीं मिल रहा है, बिलकुल भी, कोई भी इंटरनेट स्रोत जो इसे समझाता है, आपके स्पष्टीकरण का उल्लेख नहीं करना बहुत सरल, संक्षिप्त और स्पष्ट है। – hashDefine

+1

@hashDefine Qt निर्माता qmake को कॉल करते समय CONFIG को "रिलीज़" जोड़ सकता है। उदाहरण के लिए, यदि आप "बिल्ड" मेनू में "qmake चलाएं" का चयन करते हैं और आपने अपना निर्माण रिलीज़ मोड पर सेट किया है, तो आप इसे "CONFIG + = रिलीज़" को qmake के तर्क के रूप में पास कर सकते हैं। चूंकि CONFIG में पहले से ही "डीबग" हो सकता है (या तो क्योंकि आपने इसे अपनी प्रोजेक्ट फ़ाइल में स्वयं रखा है, या यह एक mkspec फ़ाइल से आ सकता है), इसे ओवरराइड करने का एक तरीका होना चाहिए। यही कारण है कि "CONFIG में अंतिम दिखाई देता है" नियम मौजूद है। मैंने जो उदाहरण दिया वह बस था; एक उदाहरण। स्वयं को कॉन्फिग करने के लिए "रिलीज" और "डीबग" दोनों जोड़ने में कोई उपयोग नहीं है। –