উত্তর:
আপডেট: এই উত্তরটি আধুনিক সিএমকে যুগের পূর্বাভাস দেয়। প্রতিটি বুদ্ধিমান সিএমকে ব্যবহারকারীর 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
। তবে আমার অভিজ্ঞতা থেকে এটি অনেক বেশি সতর্কতা তৈরি করে।