संकलक को झंडे प्राप्त करने के लिए सीएमके द्वारा दिए गए कई तंत्र हैं:
क्या एक तरीका है जो आधुनिक उपयोग में दूसरे पर पसंद किया जाता है? यदि हां तो क्यों? इसके अलावा, MSVC जैसे कई कॉन्फ़िगरेशन सिस्टम के साथ इस विधि का उपयोग कैसे किया जा सकता है?
संकलक को झंडे प्राप्त करने के लिए सीएमके द्वारा दिए गए कई तंत्र हैं:
क्या एक तरीका है जो आधुनिक उपयोग में दूसरे पर पसंद किया जाता है? यदि हां तो क्यों? इसके अलावा, MSVC जैसे कई कॉन्फ़िगरेशन सिस्टम के साथ इस विधि का उपयोग कैसे किया जा सकता है?
जवाबों:
आधुनिक सीएमके (2.8.12 और ऊपर के संस्करणों) के लिए आपको उपयोग करना चाहिए target_compile_options, जो आंतरिक रूप से लक्ष्य गुणों का उपयोग करता है।
CMAKE_<LANG>_FLAGSएक वैश्विक चर और उपयोग करने के लिए सबसे अधिक त्रुटि वाला है। यह जनरेटर अभिव्यक्तियों का भी समर्थन नहीं करता है , जो बहुत काम में आ सकता है।
add_compile_options निर्देशिका गुणों पर आधारित है, जो कुछ स्थितियों में ठीक है, लेकिन आमतौर पर विकल्पों को निर्दिष्ट करने का सबसे प्राकृतिक तरीका नहीं है।
target_compile_optionsप्रति-लक्ष्य के आधार पर काम करता है ( गुणों COMPILE_OPTIONSऔर INTERFACE_COMPILE_OPTIONSलक्ष्य को निर्धारित करने के माध्यम से ), जिसके परिणामस्वरूप आमतौर पर सबसे साफ सीएमके कोड होता है, क्योंकि स्रोत फ़ाइल के लिए संकलन विकल्प किस परियोजना से संबंधित होते हैं, जो फ़ाइल से संबंधित है (जिसके बजाय इसे निर्देशिका में रखा गया है। हार्ड डिस्क पर)। इसका अतिरिक्त लाभ यह है कि यह स्वचालित रूप से अनुरोध किए जाने पर आश्रित लक्ष्यों को पारित करने के विकल्प का ख्याल रखता है ।
भले ही वे थोड़ी अधिक क्रियात्मक हों, लेकिन प्रति-लक्ष्य आदेश विभिन्न बिल्ड विकल्पों पर एक यथोचित ठीक-ठीक नियंत्रण की अनुमति देते हैं और (मेरे व्यक्तिगत अनुभव में) लंबे समय में सिरदर्द पैदा करने की कम से कम संभावना है।
सिद्धांत रूप में, आप संबंधित गुणों को सीधे उपयोग करके भी सेट कर सकते हैं set_target_properties, लेकिन target_compile_optionsआमतौर पर अधिक पठनीय होता है।
उदाहरण के लिए, fooआपके द्वारा लिखी गई जनरेटर अभिव्यक्तियों का उपयोग करते हुए कॉन्फ़िगरेशन के आधार पर लक्ष्य के संकलन विकल्प सेट करने के लिए :
target_compile_options(foo PUBLIC "$<$<CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>")
target_compile_options(foo PUBLIC "$<$<CONFIG:RELEASE>:${MY_RELEASE_OPTIONS}>")
target_compile_options जोड़ें , ताकि आप इसे और अधिक पठनीय बनाने के लिए इस तरह अंतिम पंक्ति को संशोधित कर सकें )
COMPILE_OPTIONSनिर्देशिका संपत्ति ऐसा करती है। add_compile_optionsइसे सेट करने के लिए आप कमांड का उपयोग कर सकते हैं । जिन विकल्पों के लिए यह एक अच्छा दृष्टिकोण है, वे आमतौर पर कुछ और दूर के बीच होते हैं।
PUBLICहै target_compile_options?