जवाबों:
अद्यतन: यह उत्तर आधुनिक सीएमके युग से पहले का है। हर समझदार सीएमके उपयोगकर्ता को CMAKE_CXX_FLAGS
सीधे-सीधे फ़िज़लिंग से बचना चाहिए और target_compile_options
इसके बजाय कमांड को कॉल करना चाहिए। चेक एमआरटीएस 'जवाब जो सिफारिश सबसे अच्छा अभ्यास प्रस्तुत करता है।
आप ऐसा ही कुछ कर सकते हैं:
if(MSVC)
# Force to always compile with W4
if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
endif()
elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
# Update if necessary
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic")
endif()
/Wall
यदि आप चेतावनियों की तरह चेतावनियों के लिए 'घटाव' की रणनीति का पालन करना चाहते हैं, तो यह प्रयोग करने योग्य है -Weverything
। सक्षम करने के लिए चेतावनियों का चयन करने के बजाय, आप सब कुछ सक्षम करते हैं और फिर अक्षम करने के लिए विशिष्ट चेतावनियों का चयन करते हैं।
आधुनिक सीएमके में, निम्नलिखित अच्छी तरह से काम करता है:
if(MSVC)
target_compile_options(${TARGET_NAME} PRIVATE /W4 /WX)
else()
target_compile_options(${TARGET_NAME} PRIVATE -Wall -Wextra -pedantic -Werror)
endif()
मेरे सहयोगी ने एक वैकल्पिक संस्करण सुझाया:
target_compile_options(${TARGET_NAME} PRIVATE
$<$<CXX_COMPILER_ID:MSVC>:/W4 /WX>
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-Wall -Wextra -pedantic -Werror>
)
${TARGET_NAME}
वास्तविक लक्ष्य नाम से बदलें । -Werror
वैकल्पिक है, यह सभी चेतावनियों को त्रुटियों में बदल देता है।
या उपयोग करें add_compile_options(...)
यदि आप इसे टिप्पणियों में @aldo द्वारा सुझाए गए सभी लक्ष्यों पर लागू करना चाहते हैं।
इसके अलावा, के बीच के अंतर को समझना सुनिश्चित करें PRIVATE
और PUBLIC
(सार्वजनिक विकल्प उन लक्ष्यों द्वारा विरासत में प्राप्त होंगे जो दिए गए लक्ष्य पर निर्भर करते हैं)।
add_compile_options(...)
अगर आप इसे सभी लक्ष्यों पर लागू करना चाहते हैं।
else()
या हालत को दोहराने की आवश्यकता नहीं है endif()
।
add_compile_options()
यह है कि चेतावनियों के माध्यम से जोड़े गए लक्ष्यों को प्रचारित किया जाएगा add_subdirectory()
। यदि आप बाहरी पुस्तकालयों को इस तरह से शामिल करते हैं तो आपको बहुत सारी चेतावनियाँ मिल सकती हैं यदि उस पुस्तकालय को अलग-अलग चेतावनी स्तर के साथ डिज़ाइन किया गया हो।
मेरे द्वारा लिखे गए कुछ सीएमके मॉड्यूल में प्रायोगिक क्रॉस-प्लेटफ़ॉर्म चेतावनी दमन शामिल हैं :
sugar_generate_warning_flags(
target_compile_options
target_properties
ENABLE conversion
TREAT_AS_ERRORS ALL
)
set_target_properties(
foo
PROPERTIES
${target_properties}
COMPILE_OPTIONS
"${target_compile_options}"
)
Xcode के लिए परिणाम:
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION
Xcode विशेषता (उर्फ बिल्ड सेटिंग्स -> चेतावनियाँ -> संदिग्ध अंतर्निहित रूपांतरण -> हाँ )-Werror
Makefile gcc और clang:
-Wconversion
,-Werror
दृश्य स्टूडियो:
/WX
,/w14244
यहाँ अब तक का सबसे अच्छा समाधान है (एक संकलक जाँच सहित):
if(CMAKE_BUILD_TOOL MATCHES "(msdev|devenv|nmake)")
add_definitions(/W2)
endif()
यह Visual Studio में चेतावनी स्तर 2 सेट करेगा। मुझे लगता है कि -W2
यह जीसीसी (अनछुए) में भी काम करेगा।
@Williams से अपडेट: यह -Wall
जीसीसी के लिए होना चाहिए ।
-Wall
और शायद gcc.gnu.org/onbuildocs/gcc/Warning-Options.html-Wextra
पर विस्तृत होगा
-W -Wall -Wextra -pedantic
। -Wextra
IIRC -W
को GCC के बाद के संस्करण में बदल दिया गया, लेकिन मैं दोनों को कॉम्पिटिशन के लिए छोड़ देता हूं।
Cmake 3.17.1 प्रलेखन के अनुसार :
if (MSVC)
# warning level 4 and all warnings as errors
add_compile_options(/W4 /WX)
else()
# lots of warnings and all warnings as errors
add_compile_options(-Wall -Wextra -pedantic -Werror)
endif()
जीसीसी और क्लैंग इन झंडों को साझा करते हैं, इसलिए इसे सभी 3 को कवर करना चाहिए।
add_compile_options
निर्देशिका-चौड़ा है, जबकि target_compile_options
केवल एक लक्ष्य के लिए है।
if(MSVC)
string(REGEX REPLACE "/W[1-3]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
endif()
यदि आप उपयोग करते हैं target_compile_options
- सेमीक डबल /W*
ध्वज का उपयोग करने का प्रयास करेगा , जो संकलक द्वारा चेतावनी देगा।
add_compile_options
केवल उन चेतावनियों को प्राप्त करने के लिए उपयोग कर रहा था, /W3
जिनके साथ सामना किया जा रहा है /W4
। तथ्य यह है कि सीएमके इस अल्पविकसित विकल्प को संबोधित नहीं कर रहे हैं (चेतावनी स्तर स्थापित करना) विश्वास से परे है।
/Wall
ध्वज (जिसे नाम दिया गया हैEnableAllWarnings
)। की तुलना में यह और भी अधिक चेतावनी उत्पन्न करता है/W4
। हालांकि मेरे अनुभव से यह बहुत अधिक चेतावनी पैदा करता है।