सीएमके में सामान्य संकलित झंडे स्थापित करने की आधुनिक विधि क्या है?


84

संकलक को झंडे प्राप्त करने के लिए सीएमके द्वारा दिए गए कई तंत्र हैं:

क्या एक तरीका है जो आधुनिक उपयोग में दूसरे पर पसंद किया जाता है? यदि हां तो क्यों? इसके अलावा, MSVC जैसे कई कॉन्फ़िगरेशन सिस्टम के साथ इस विधि का उपयोग कैसे किया जा सकता है?


जवाबों:


94

आधुनिक सीएमके (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}>")

12
ध्यान दें कि विकल्प target_compile_options जोड़ें , ताकि आप इसे और अधिक पठनीय बनाने के लिए इस तरह अंतिम पंक्ति को संशोधित कर सकें )

2
@ComicSansMS महान जवाब और सबसे अच्छा (और सबसे अप-टू-डेट) जो मुझे इंटरनेट पर मिल सकता है। धन्यवाद!
इला 782

अगर मैं विश्व स्तर पर संकलन झंडों का एक ही सख्त सेट चाहता हूं, तो इसे करने का सबसे अच्छा तरीका क्या है? एक ही झंडे को बार-बार अलग-अलग निशाने के लिए target_compile_options के साथ निर्दिष्ट करना एक बुरा विचार लगता है
user3667089

1
@ user3667089 लक्ष्य-विशिष्ट गुण आमतौर पर एक चर या निर्देशिका संपत्ति द्वारा आरंभ किए जाते हैं। संबंधित संपत्ति के लिए पेज आपको बताता है कि वास्तव में क्या है। संकलन विकल्पों के मामले में, COMPILE_OPTIONSनिर्देशिका संपत्ति ऐसा करती है। add_compile_optionsइसे सेट करने के लिए आप कमांड का उपयोग कर सकते हैं । जिन विकल्पों के लिए यह एक अच्छा दृष्टिकोण है, वे आमतौर पर कुछ और दूर के बीच होते हैं।
कॉमिक्ससंस

6
@ComicSansMS का उपयोग किसमें होता PUBLICहै target_compile_options?
रमना रेड्डी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.