একক ফাইলগুলির জন্য সংকলিত পতাকাগুলি ওভাররাইড করুন


109

একটি প্রকল্প সংকলনের জন্য আমি বিশ্বব্যাপী পতাকা ব্যবহার করতে চাই, যার অর্থ আমার শীর্ষ-স্তরের সিএমকেলিস্ট.টেক্সট ফাইলটিতে আমি নির্দিষ্ট করেছি:

ADD_DEFINITIONS ( -Wall -Weffc++ -pedantic -std=c++0x )

যাইহোক, একটি উপ-ডিরেক্টরিতে একটি নির্দিষ্ট ফাইলের জন্য (যাক "foo.cpp" বলুন) জন্য, আমি -Weffc ++ প্রয়োগ না করার জন্য কম্পাইল পতাকাগুলি স্যুইচ করতে চাই (অন্তর্ভুক্ত বাণিজ্যিক লাইব্রেরি যা আমি পরিবর্তন করতে পারি না)। শুধুমাত্র-ওয়াল ব্যবহার করার জন্য পরিস্থিতি সরল করার জন্য, আমি চেষ্টা করেছি:

 SET_SOURCE_FILES_PROPERTIES( foo.cpp PROPERTIES COMPILE_FLAGS -Wall )
 ADD_EXECUTABLE( foo foo.cpp )

, যা কাজ করে না। আমিও চেষ্টা করেছি

SET_PROPERTY( SOURCE foo.cpp PROPERTY COMPILE_FLAGS -Wall )
ADD_EXECUTABLE( foo foo.cpp )

এবং

ADD_EXECUTABLE( foo foo.cpp )
SET_TARGET_PROPERTIES( foo PROPERTIES COMPILE_FLAGS -Wall )

, যা উভয়ই কাজ করে না।

অবশেষে, আমি এই সংজ্ঞাটি সরিয়ে দেওয়ার চেষ্টা করেছি:

REMOVE_DEFINITIONS( -Weffc++ )
ADD_EXECUTABLE( foo foo.cpp )
ADD_DEFINITIONS( -Weffc++ )

, যা কার্যকর হয়নি (অর্থাত্ বাণিজ্যিক গ্রন্থাগার সম্পর্কে আমি প্রচুর স্টাইলের সতর্কতা পাই)। (** দ্রষ্টব্য: এক্সিকিউটেবল নির্মিত হওয়ার পরে যদি আমি-ওয়েফসি ++ নির্দেশকে আবার অন্তর্ভুক্ত না করি তবে সতর্কতাগুলি দমন করা হবে RE)

আমি এই সংকলন পতাকাগুলি অস্থায়ীভাবে অপসারণ করার চেষ্টা করেছি: http://www.cmake.org/pipermail/cmake/2007- জুন 0614614 এইচটিএমএল , কিন্তু তাতে কোনও লাভ হয়নি।

এটির জন্য কি কোনও মার্জিত সমাধান নেই?


1
অপেক্ষা করুন, যদি আপনার শেষ চেষ্টাটি কাজ করে তবে কেবল এটি তৈরির পরে, এটি কি ক্যাচিংয়ের সমস্যা নয়? আপনার পরিবর্তন (গুলি) তৈরি করার পরে সিএমকেচেচি মুছে ফেলার চেষ্টা করুন।
ক্যামেরন

সম্পর্কিত, দেখুন সিএমকে মাত্র একটি এক্সিকিউটেবলের জন্য সংকলক পতাকা কীভাবে পরিবর্তন করবেন? আন্ড্রে এর উত্তরগুলি দেখায় যা বিদ্যমান বিকল্পগুলিকে নতুন বিকল্পগুলির সাথে প্রতিস্থাপনের একটি উপায় বলে মনে হচ্ছে।
jw

উত্তর:


126

উপরের আপনার প্রচেষ্টাটি আপনার প্রত্যাশার মতো মনে হচ্ছে ওভাররাইটিংয়ের পরিবর্তে আপনার ফাইল / লক্ষ্যতে আরও পতাকা যুক্ত করছে। উদাহরণস্বরূপ, উত্স ফাইলগুলিতে সম্পত্তিগুলির ডক্স থেকে - 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")

নীচের মন্তব্যে আরও প্রশ্নের জবাবে, আমি বিশ্বাস করি যে একটি একক ফাইলে বিশ্বস্তভাবে পতাকা মুছে ফেলা অসম্ভব । কারণটি হ'ল যে কোনও প্রদত্ত উত্স ফাইলের জন্য, এটিতে তার টার্গেটের 1COMPILE_OPTIONS এবং 1 প্রয়োগ করা হয়েছে, তবে এগুলি সেই উত্স ফাইলের জন্য কোনও বৈশিষ্ট্যে প্রদর্শিত হয় না।COMPILE_FLAGS

আপনি লক্ষ্যটির থেকে সমস্যার পতাকাটি সরিয়ে ফেলার দিকে লক্ষ্য COMPILE_OPTIONSরাখতে পারেন, তারপরে এটি প্রয়োজনীয় প্রতিটি নির্দিষ্ট উত্স ফাইল থেকে বাদ দিয়ে লক্ষ্যের প্রতিটি উত্সে স্বতন্ত্রভাবে প্রয়োগ করতে পারেন।

তবে এটি যখন অনেক পরিস্থিতিতে কাজ করতে পারে তবে এতে বেশ কয়েকটি সমস্যা রয়েছে।

প্রথম - উত্স ফাইলগুলির বৈশিষ্ট্যগুলিCOMPILE_OPTIONS কেবলমাত্র অন্তর্ভুক্ত নয় COMPILE_FLAGS। এটি একটি সমস্যা কারণ COMPILE_OPTIONSলক্ষ্যটির মধ্যে জেনারেটর এক্সপ্রেশন অন্তর্ভুক্ত থাকতে পারে তবে COMPILE_FLAGSসেগুলি সমর্থন করে না। সুতরাং আপনার পতাকাটি অনুসন্ধান করার সময় আপনাকে জেনারেটর এক্সপ্রেশনগুলি সামঞ্জস্য করতে হবে এবং আপনার পতাকাটি যদি একটি বা একাধিকতে অন্তর্ভুক্ত থাকে তবে এটি অন্য অংশে পুনরায় প্রয়োগ করা উচিত কিনা তা দেখার জন্য আপনাকে জেনারেটর এক্সপ্রেশনগুলি সংশ্লেষ করতে হবে সোর্স ফাইল.

দ্বিতীয় - সিএমকে ভি ৩.০ থেকে লক্ষ্যগুলি নির্দিষ্ট করতে পারে INTERFACE_COMPILE_OPTIONS। এর অর্থ হ'ল আপনার টার্গেটের নির্ভরতা আপনার টার্গেটকে এর COMPILE_OPTIONSমাধ্যমে যুক্ত করতে বা ওভাররাইড করতে পারে INTERFACE_COMPILE_OPTIONS। সুতরাং আপনাকে আরও লক্ষ্যবস্তুর সমস্ত নির্ভরতার মধ্য দিয়ে পুনরাবৃত্তি করতে হবে (লক্ষ্যটির তালিকায় LINK_LIBRARIESজেনারেটর এক্সপ্রেশনও থাকতে পারে বলে একটি বিশেষ সহজ কাজ নয় ) যা সমস্যার পতাকাটি প্রয়োগ করছে এটি আবিষ্কার করতে এবং সেগুলি থেকে এটিকে সরিয়ে চেষ্টা করে দেখতে হবে লক্ষ্য ' INTERFACE_COMPILE_OPTIONSখুব।

জটিলতার এই পর্যায়ে, আমি উত্স ফাইল থেকে নিঃশর্তভাবে একটি নির্দিষ্ট পতাকা সরিয়ে ফাংশনটি সরবরাহ করতে সিএমকে একটি প্যাচ জমা দিতে চাই।


1: নোট করুন যে COMPILE_FLAGSউত্স ফাইলগুলিতে থাকা সম্পত্তির বিপরীতে , COMPILE_FLAGSলক্ষ্যগুলিতে সম্পত্তি হ্রাস করা হয়।


6
তবে কীভাবে আপনি ফাইলগুলি সংযোজন না করে আলাদাভাবে সংকলন পতাকাগুলি আলাদাভাবে সেট করেন। উদাহরণস্বরূপ, আমি ফাইলগুলির চেয়ে ফলাফলের লক্ষ্যবস্তুতে বিভিন্ন সংকলন পতাকা ব্যবহার করতে চাই তবে সেগুলি সংযুক্ত হওয়ার কারণে আমাকে সেগুলি নিজেই সরিয়ে ফেলতে হবে। এমন কোনও সম্পত্তি নেই যা সংযোজন না করে তবে কেবলমাত্র নির্দিষ্ট ফাইল / টার্গেটের জন্য সেগুলি সেট করে?
বড়দি

2
যখন -ফান-পতাকা পাওয়া যায় না (এবং -ফ্লেগ সেট করা থাকে) তখন আমরা কী করতে পারি?
gnzlbg

@ বারাদé আপনি পারবেন না - উত্স ফাইলের জন্য নয়।
ফ্রেজার

@gnzlbg আবার, আমরা বেশ আটকে আছি। আমি আমার উত্তর আপডেট করেছি কিছুটা আরও তথ্য দেওয়ার জন্য (এবং একটি সম্ভাব্য কাজ যা সম্ভবত কিছু পরিস্থিতিতে কাজ করবে )।
ফ্রেজার

একক ফাইলের সংকলন বিকল্পগুলির সেটিংটিতে আসলেই কোনও কাজ নেই? জিসিওভি ক্র্যাশ করছে এমন কিছু ফাইলের জন্য আমাকে জিসিসি কভারেজ জেনারেশনটি অক্ষম করতে হবে।
লোথার

5

কেবলমাত্র @ ফ্রেজারের সঠিক উত্তরটিতে যুক্ত করা।

যদি আপনি নির্দিষ্ট ফোল্ডারে বিশেষ পতাকা যুক্ত করতে চান তবে আপনি করতে পারেন:

file(GLOB SPECIAL_SRC_FILES
        "path/one/src/*.cpp"
        "path/two/src/*.cpp")
set_property(SOURCE ${SPECIAL_SRC_FILES} PROPERTY COMPILE_FLAGS -Wno-effc++)

অথবা

file(GLOB SPECIAL_SRC_FILES
        "path/one/src/*.cpp"
        "path/two/src/*.cpp")
set_source_files_properties(${SPECIAL_SRC_FILES} PROPERTIES COMPILE_FLAGS -Wno-effc++)

মনে রাখবেন যে এটি এখানে আলোচিত হিসাবে GLOB ব্যবহার করার জন্য প্রস্তাবিত নয়


0

@ ফ্রেজার উত্তরটি ব্যবহার করে, আমি কিউটি অন্তর্ভুক্ত হ্যান্ডেল করতে নিম্নলিখিতটি তৈরি করেছি কারণ ভেরিয়েবলটিতে সেমিকোলন দ্বারা বিচ্ছিন্ন একাধিক পাথ রয়েছে। এর অর্থ হ'ল আমাকে প্রথমে একটি foreach()লুপ যুক্ত করতে হবে এবং হাতে থাকা পতাকাগুলি তৈরি করতে হয়েছিল । তবে এটি আমাকে একটি ব্যতিক্রম করতে দেয়: foo.cpp (যে একটি ফাইল আপাতত Qt ব্যবহার করে তবে দীর্ঘমেয়াদে আমি সেই নির্ভরতা অপসারণ করতে চাই এবং আমি নিশ্চিত করতে চাই যে কোথাও কোথাও ক্রিট ক্রাইপস নয়)।

find_package(Qt5Core REQUIRED)
set(QT_INCLUDE_PROPERTIES "")
foreach(DIR ${Qt5Core_INCLUDE_DIRS})
    set(QT_INCLUDE_PROPERTIES "${QT_INCLUDE_PROPERTIES} -isystem ${DIR}")
endforeach()
set_source_files_properties(foo.cpp PROPERTIES
    COMPILE_FLAGS
        ${QT_INCLUDE_PROPERTIES}
)

এও লক্ষ করুন যে আমি কিউটি শিরোনাম অন্যথায় উত্সাহিত করে এমন কিছু সতর্কতা এড়াতে -isystemপরিবর্তে ব্যবহার করেছি -I(আমার কাছে এক টন সতর্কতা চালু আছে)।

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