ऊपर दिए गए आपके प्रयास आपकी फ़ाइल / लक्ष्य में आगे के झंडे जोड़ रहे हैं बजाय कि आप अपेक्षा के अनुरूप हैं। उदाहरण के लिए, स्रोत फ़ाइलों पर गुणों के लिए डॉक्स से - COMPILE_FLAGS :
जब ये स्रोत फ़ाइल बनाता है तो ये झंडे संकलन झंडों की सूची में जुड़ जाएंगे।
आपको -Weffc++
ऐसा करने के लिए foo.cpp के लिए ध्वज का प्रतिकार करने में सक्षम होना चाहिए
set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -Wno-effc++)
इसमें कंपाइलर कमांड के -Wno-effc++
बाद जोड़ने का प्रभाव होना चाहिए -Weffc++
, और बाद की सेटिंग जीत जाती है। पूर्ण कमांड को देखने के लिए और जांचें कि यह वास्तव में मामला है, आप कर सकते हैं
make VERBOSE=1
एक तरफ, जीएनयू सी ++ स्टैंडर्ड लाइब्रेरी के अनुरक्षकों में से एक इस उत्तर-Weffc++
में एक बहुत ही नकारात्मक राय प्रस्तुत करता है ।
एक और बात यह है कि आप add_definitions
इस अर्थ में दुरुपयोग कर रहे हैं कि आप इसका उपयोग संकलक झंडे के लिए कर रहे हैं, बजाय इच्छित प्रीप्रोसेसर परिभाषाओं के।
यह उपयोग करने के लिए बेहतर होगा add_compile_options
add_compile_options(-Wall -Weffc++ -pedantic -std=c++0x)
या सीएमके संस्करणों के लिए <3.0 कुछ और करने के लिए जैसे:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Weffc++ -pedantic -std=c++0x")
नीचे दी गई टिप्पणियों में आगे के सवालों के जवाब में, मेरा मानना है कि किसी एकल फ़ाइल पर किसी ध्वज को विश्वसनीय रूप से निकालना असंभव है । कारण यह है कि किसी भी स्रोत फ़ाइल के लिए, उसके पास COMPILE_OPTIONS
और उसके लक्ष्य का 1 लागू होता है, लेकिन ये उस स्रोत फ़ाइल के किसी भी गुण में दिखाई नहीं देते हैं।COMPILE_FLAGS
आप लक्ष्य से समस्या के झंडे को उतारने पर विचार कर सकते हैं COMPILE_OPTIONS
, फिर इसे लक्ष्य के प्रत्येक स्रोत पर व्यक्तिगत रूप से लागू कर सकते हैं, इसे आवश्यक स्रोत फ़ाइल से अलग कर सकते हैं।
हालाँकि, जबकि यह कई परिदृश्यों में काम कर सकता है, इसमें कुछ समस्याएं हैं।
प्रथम - स्रोत फ़ाइलों के गुणों में COMPILE_OPTIONS
केवल शामिल नहीं है COMPILE_FLAGS
। यह एक समस्या है क्योंकि COMPILE_OPTIONS
लक्ष्य के लक्ष्य में जनरेटर के भाव शामिल हो सकते हैं , लेकिन COMPILE_FLAGS
उनका समर्थन नहीं करता है। इसलिए आपको अपने ध्वज की खोज करते समय जनरेटर के भावों को समायोजित करना होगा, और वास्तव में आपको जनरेटर के भावों को "पार्स" करना होगा यदि आपका झंडा एक या एक से अधिक में शामिल था या नहीं यह देखने के लिए कि क्या इसे शेष पर फिर से लागू किया जाना चाहिए स्रोत फ़ाइलें।
दूसरा - CMake v3.0 के बाद से, लक्ष्य निर्दिष्ट कर सकते हैं INTERFACE_COMPILE_OPTIONS
। इसका मतलब है कि आपके लक्ष्य की एक निर्भरता आपके लक्ष्य COMPILE_OPTIONS
को इसके माध्यम से जोड़ या ओवरराइड कर सकती है INTERFACE_COMPILE_OPTIONS
। तो आपको आगे अपने सभी लक्ष्य की निर्भरता के माध्यम से पुनरावृत्ति करना होगा (विशेष रूप से आसान काम नहीं है क्योंकि LINK_LIBRARIES
लक्ष्य की सूची में जनरेटर के भाव भी हो सकते हैं) किसी भी समस्या का झंडा लगाने वाले को खोजने के लिए, और कोशिश करें और इसे उन लोगों से हटा दें लक्ष्य INTERFACE_COMPILE_OPTIONS
भी।
जटिलता के इस चरण में, मैं सीएमके को एक स्रोत फ़ाइल से बिना शर्त एक विशिष्ट ध्वज को हटाने के लिए कार्यक्षमता प्रदान करने के लिए एक पैच प्रस्तुत करना चाहूंगा।
1: ध्यान दें कि COMPILE_FLAGS
स्रोत फ़ाइलों पर संपत्ति के विपरीत , COMPILE_FLAGS
लक्ष्य पर संपत्ति को हटा दिया जाता है।