উত্তর:
আপডেট: এই উত্তরটি আধুনিক সিএমকে যুগের পূর্বাভাস দেয়। প্রতিটি বুদ্ধিমান সিএমকে ব্যবহারকারীর 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এটি alচ্ছিক, এটি সমস্ত সতর্কতাগুলিকে ত্রুটিতে পরিণত করে।
অথবা add_compile_options(...)আপনি মন্তব্যগুলিতে @ আলডোর পরামর্শ অনুযায়ী সমস্ত লক্ষ্যগুলিতে এটি প্রয়োগ করতে চান তবে ব্যবহার করুন ।
এছাড়াও, 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}"
)
এক্সকোডের ফলাফল:
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSIONএক্সকোড বৈশিষ্ট্য সেট করুন (ওরফে বিল্ড সেটিংস -> সতর্কতা -> সন্দেহজনক অন্তর্ভুক্ত রূপান্তর -> হ্যাঁ )-Werrorমেকফিল জিসিসি এবং ঝনঝন:
-Wconversion,-Werrorভিসুয়াল স্টুডিও:
/WX,/w14244আমি এখন অবধি খুঁজে পাওয়া সেরা সমাধানটি এখানে (সংকলক চেক সহ):
if(CMAKE_BUILD_TOOL MATCHES "(msdev|devenv|nmake)")
add_definitions(/W2)
endif()
এটি ভিজ্যুয়াল স্টুডিওতে সতর্কতা স্তর 2 সেট করবে। আমি মনে করি -W2এটির সাহায্যে এটি জিসিসিতেও কাজ করবে (অনির্ধারিত)।
@ উইলিয়ামস থেকে আপডেট: এটি -Wallজিসিসির জন্য হওয়া উচিত ।
-Wallএবং হয়ত -Wextraযেমন এ বিস্তারিত gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
-W -Wall -Wextra -pedantic। -Wextraআইআইআরসি -Wজিসিসির পরবর্তী সংস্করণে প্রতিস্থাপিত হয়েছিল, তবে আমি উভয়ই সামঞ্জস্যের কারণে ছেড়ে চলেছি ।
অনুযায়ী 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- cmake ডাবল /W*পতাকা ব্যবহার করার চেষ্টা করবে , যা সংকলক দ্বারা সতর্কতা দেবে।
add_compile_optionsকেবলমাত্র প্রচুর সংখ্যক সতর্কতাগুলি ব্যবহার করেছি /W3যা দিয়ে ওভার্রাইড করা হচ্ছে /W4। সিএমকে এই মূল বিকল্পটিকে (সতর্কতা স্তর নির্ধারণ করা) সম্বোধন করা হচ্ছে না বলে বিশ্বাসের বাইরে beyond
/Wallপতাকা (যার নাম দেওয়া হয়েছেEnableAllWarnings)। এটি এর চেয়েও বেশি সতর্কবার্তা উত্পন্ন করে/W4। তবে আমার অভিজ্ঞতা থেকে এটি অনেক বেশি সতর্কতা তৈরি করে।