কীভাবে সিএমকে সতর্কতা স্তর সেট করবেন?


116

কিভাবে সেট করতে সাবধানবাণী স্তর একটি জন্য প্রকল্প (না পুরো সলিউশন) ব্যবহার CMake ? ভিজ্যুয়াল স্টুডিও এবং জিসিসিতে কাজ করা উচিত ।

আমি বিভিন্ন অপশন পেয়েছি তবে বেশিরভাগ মনে হয় কাজ করবে না বা ডকুমেন্টেশনের সাথে সামঞ্জস্য নয়।

উত্তর:


96

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

লক্ষ্য করুন যে ভিজ্যুয়াল স্টুডিওর নতুন সংস্করণ (কমপক্ষে 2013) সমর্থন /Wallপতাকা (যার নাম দেওয়া হয়েছে EnableAllWarnings)। এটি এর চেয়েও বেশি সতর্কবার্তা উত্পন্ন করে /W4। তবে আমার অভিজ্ঞতা থেকে এটি অনেক বেশি সতর্কতা তৈরি করে।
আদম বদুরা

12
/Wallআপনি যদি ঝাঁকুনির মতো সতর্কতার জন্য 'সাবট্রেসিভ' কৌশলটি অনুসরণ করতে চান তবে ব্যবহারযোগ্য -Weverything। সক্ষম করার জন্য সতর্কতাগুলি নির্বাচন করার পরিবর্তে, আপনি সমস্ত কিছু সক্ষম করুন এবং তারপরে অক্ষম করার জন্য নির্দিষ্ট সতর্কতাগুলি নির্বাচন করুন।
bames53

86

আধুনিক সিএমকেতে, নিম্নলিখিতগুলি ভালভাবে কাজ করে:

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করুন (প্রদত্ত টার্গেটের উপর নির্ভরশীল লক্ষ্যগুলি দ্বারা সর্বজনীন বিকল্পগুলি উত্তরাধিকার সূত্রে প্রাপ্ত হবে)।


19
বা কেবলমাত্র add_compile_options(...)আপনি যদি এটি সমস্ত লক্ষ্যগুলিতে প্রয়োগ করতে চান।
aldo

1
অবগতির জন্য আধুনিক CMake মধ্যে শর্ত পুনরায় প্রয়োজন হয় না else()বা endif()
টিম্ম্ম্ম

1
@ টিম্মম্মম মাথা নিচু করার জন্য ধন্যবাদ! এটি কি কেবল একটি নোট বা আপনি আমাকে শর্তগুলি সরাতে পছন্দ করবেন?
মিস্টারস

1
@ হেলমেজো নো, টিম্ম্ম্মে সিএমকে কোডটি উল্লেখ করছে যেহেতু 9 ই এপ্রিল সম্পাদনার আগে এটি বিদ্যমান ছিল। আপনি বিটগুলি মুছে ফেলা বিটগুলি দেখতে সম্পাদনা ইতিহাসের দিকে একবার নজর রাখতে পারেন, এটি একই বিষয় যা টিম্ম্ম্মাম নির্দেশ করছিল।
30:48

2
@ তবে সমস্যাটি add_compile_options()হ'ল সতর্কতাগুলি যুক্ত টার্গেটগুলিতে প্রচার করবে add_subdirectory()। আপনি যদি এইভাবে বাহ্যিক গ্রন্থাগারগুলি অন্তর্ভুক্ত করেন তবে যদি সেই লাইব্রেরিটি বিভিন্ন সতর্কতা স্তরের সাথে নকশাকৃত হয় তবে আপনি প্রচুর সতর্কতা পেতে পারেন।
ট্রোজেন

24

কিছু সিএমকে মডিউল আমি লিখেছি পরীক্ষামূলক ক্রস প্ল্যাটফর্ম থেকে সতর্কতা দমন অন্তর্ভুক্ত :

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

লিংক


1
এটি লজ্জার বিষয় যে ক্রিমিয়াটি এই কার্যকারিতাটি সরবরাহ করে না
স্লাভা

3
ভাল খবর. এখানে পোস্ট করার জন্য দুঃখিত এবং চাহক মেইলিং-তালিকায় নয়, তবে স্তর ছাড়াই এটি অকেজো হবে, এগুলি সমস্ত স্পষ্টভাবে তালিকাভুক্ত করার জন্য খুব বেশি সতর্কতা রয়েছে। আপনি যদি এটির এক উপায়ে একত্রিত করতে চান তবে এটি দুটি আলাদা cmake_level - সতর্কতার একক সেট, ঝাঁকুনির উপর ভিত্তি করে তৈরি করা এবং সংকলকের জন্য নির্দিষ্ট অর্থ সহ নেটিটি_ লেভেল। এর মধ্যে একটি সম্ভবত স্তরে সংক্ষিপ্ত করা যেতে পারে। দুঃখিত যদি আমি সত্যই কথোপকথনটি না অনুসরণ করি এবং কিছু ভুল হয়ে পড়ে
স্লাভা

1
@ void.pointer একটি বৈধ পয়েন্ট উত্থাপন করে। আপনার প্রস্তাবিত উত্তরটি পড়ে: " আমি এই বৈশিষ্ট্যটি যুক্ত করার পরিকল্পনা করছি " । এটি বলে না যে আপনি কিছু কসরত গবেষণা করেছেন এবং এখন অন্য কেউ আপনার জন্য ভারী উত্তোলন করার আশা করছেন। আপনি যদি বাস্তবায়নের (এবং এর অগ্রগতির প্রশ্নগুলির) সাথে দায়ী হতে না চান তবে আপনাকে নিজের উত্তরটি সম্পাদনা করতে হবে এবং এক বছরেরও বেশি সময় ধরে আপনি যে কাজটিতে কোনও অগ্রগতি করেননি তা থেকে নিজেকে বিচ্ছিন্ন করতে হবে।
IInspectable

"এক বছর পরেও এখনও কোনও অগ্রগতি হয়নি।" - এখন যে হয় একটি বৈধ বিন্দু। এক বছরেরও বেশি সময় কেটে গেছে, শূন্য অগ্রগতির সাথে। এটি একটি পরিত্যক্ত প্রকল্পের খুব দৃ strong় ইঙ্গিত। আপনি যদি আমাদের ভুল প্রমাণ করতে চান তবে আমাদের কিছু অগ্রগতি দেখান। এটি ঘটেনি, তবে আপনার প্রস্তাবিত উত্তরগুলি এখনও বোঝায়, বৈশিষ্ট্যটি কেবল সিএমকে যুক্ত হতে চলেছে। বছরের পর বছর পাওয়া যাবে না এমন বৈশিষ্ট্য সম্পর্কে কেন সমস্ত ঝগড়া করবেন? এটি মোটেই সহায়ক নয়। হয় কিছু অগ্রগতি দেখান, বা আপনার উত্তরটি কম বিভ্রান্তিকর হতে সম্পাদনা করুন।
IInspectable

5
আপনি বোঝার জন্য উপস্থিত হয় না। আপনি যদি পরামর্শ দেন যে আপনি কোনও বৈশিষ্ট্য বাস্তবায়ন করতে চলেছেন, তবে আপনাকে উপযুক্ত সময়ে সেই বৈশিষ্ট্যটি প্রয়োগ করতে হবে। এটি ব্যর্থ হয়ে, আপনাকে প্রস্তাবিত উত্তর থেকে সেই প্রতিশ্রুতিটি সরিয়ে দিতে বলা হবে। আপনি বলেছেন বৈশিষ্ট্যটি বাস্তবায়নের শূন্য প্রতিশ্রুতি দেখিয়েছেন, তাই অন্যথায় দাবি করবেন না। আমি বুঝতে পারি যে এটি বড়। আমি এটিও বুঝতে পেরেছি আপনি এটিকে টানতে সক্ষম নাও হতে পারেন। আমি আপনাকে কেবল আপনার উত্তরটি প্রতিফলিত করতে বলছি।
IInspectable

6

আমি এখন অবধি খুঁজে পাওয়া সেরা সমাধানটি এখানে (সংকলক চেক সহ):

if(CMAKE_BUILD_TOOL MATCHES "(msdev|devenv|nmake)")
    add_definitions(/W2)
endif()

এটি ভিজ্যুয়াল স্টুডিওতে সতর্কতা স্তর 2 সেট করবে। আমি মনে করি -W2এটির সাহায্যে এটি জিসিসিতেও কাজ করবে (অনির্ধারিত)।

@ উইলিয়ামস থেকে আপডেট: এটি -Wallজিসিসির জন্য হওয়া উচিত ।


6
জিসিসি জন্য সতর্কবার্তা পতাকা হবে -Wallএবং হয়ত -Wextraযেমন এ বিস্তারিত gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Milliams

1
আমি যে তালিকাটি ব্যবহার করি তা হ'ল -W -Wall -Wextra -pedantic-Wextraআইআইআরসি -Wজিসিসির পরবর্তী সংস্করণে প্রতিস্থাপিত হয়েছিল, তবে আমি উভয়ই সামঞ্জস্যের কারণে ছেড়ে চলেছি ।
Jimmio92

2
এটি অ্যাড_ডিফাইনিশনগুলির উদ্দেশ্যকৃত উদ্দেশ্য নয় ( "এটি প্রিপ্রোসেসর সংজ্ঞা যুক্ত করার উদ্দেশ্য" )) এটি কেবল সেরা অনুশীলনের সুপারিশ নয়। এই কমান্ডে প্রেরিত আর্গুমেন্টগুলি উত্পন্ন বিল্ড স্ক্রিপ্টগুলি অনুরোধকারী সরঞ্জামগুলিতে প্রদর্শিত হবে যা তাদের প্রত্যাশা করে না (যেমন রিসোর্স সংকলক)।
IInspectable

এটি কোনও "সংকলক চেক" নয়, এটি একটি বিল্ড টুল চেক।
থমাস

3

অনুযায়ী 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 টি কভার করা উচিত।


এটি ব্যবহার করবেন না। পরিবর্তে, টার্গেট_কম্পাইল_অপশন () ব্যবহার করুন। সর্বশেষতম নথিটি উল্লেখ করা "সঠিক" বলে মনে হচ্ছে, তবে এটি কেবল পশ্চাৎ-সামঞ্জস্যের জন্য একটি প্রাচীন এন্ট্রি।
caoanan

1
@ Caoanan ডকুমেন্টেশনে এর জন্য পশ্চাৎ-সামঞ্জস্যের কোনও কিছুই উল্লেখ করা হয়নি। add_compile_optionsডিরেক্টরি-বিস্তৃত, যেখানে target_compile_optionsকেবল একটিমাত্র লক্ষ্যমাত্রার জন্য।
তেহওয়ান

2
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
কিয়ামত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.