সিএমকেতে সাধারণ সংকলন পতাকা স্থাপনের জন্য আধুনিক পদ্ধতিটি কী?


86

সংকলকটিতে পতাকা পাওয়ার জন্য সিএমকে প্রস্তাবিত একাধিক প্রক্রিয়া রয়েছে:

আধুনিক পদ্ধতিতে কী এমন একটি পদ্ধতি রয়েছে যা অন্যের থেকে বেশি পছন্দ হয়? যদি তাই হয় কেন? এছাড়াও, এই পদ্ধতিটি এমএসভিসির মতো একাধিক কনফিগারেশন সিস্টেমের সাথে কীভাবে ব্যবহার করা যেতে পারে?


উত্তর:


97

আধুনিক সিএমকে জন্য (সংস্করণ ২.৮.১২ এবং তার বেশি) আপনার ব্যবহার করা উচিত target_compile_options, যা অভ্যন্তরীণভাবে লক্ষ্যযুক্ত বৈশিষ্ট্যগুলি ব্যবহার করে।

CMAKE_<LANG>_FLAGSএটি একটি গ্লোবাল ভেরিয়েবল এবং ব্যবহারে সর্বাধিক ত্রুটি-প্রবণ। এটি জেনারেটর এক্সপ্রেশনগুলি সমর্থন করে না , যা খুব কাজে আসে।

add_compile_options ডিরেক্টরি বৈশিষ্ট্যের উপর ভিত্তি করে তৈরি করা হয়, যা কিছু পরিস্থিতিতে জরিমানা হয় তবে সাধারণত বিকল্পগুলি নির্দিষ্ট করার সবচেয়ে প্রাকৃতিক উপায় নয়।

target_compile_optionsপ্রতি লক্ষ্য ভিত্তিতে (কাজ করে COMPILE_OPTIONSএবং INTERFACE_COMPILE_OPTIONSলক্ষ্য বৈশিষ্ট্যগুলি নির্ধারণের মাধ্যমে ) কাজ করে যা সাধারণত সিএমকেড কোডের ফলাফল হিসাবে উত্স ফাইলের সংকলন বিকল্পগুলি ফাইলটি কোন প্রকল্পের অন্তর্ভুক্ত তা নির্ধারণ করা হয় (পরিবর্তে এটি কোনও ডিরেক্টরি স্থাপন করা হয়) হার্ড ডিস্কে)। এটির অতিরিক্ত সুবিধা রয়েছে যা যদি অনুরোধ করা হয় তবে নির্ভরশীল টার্গেটগুলিতে বিকল্পগুলি পাস করার ক্ষেত্রে এটি স্বয়ংক্রিয়ভাবে যত্ন নেয়

যদিও তারা সামান্য কিছুটা ভার্বোস, প্রতি লক্ষ্য-নির্দেশ কমান্ডগুলি বিভিন্ন বিল্ড বিকল্পগুলির উপর যুক্তিসঙ্গতভাবে সূক্ষ্ম-নিয়ন্ত্রণযুক্ত নিয়ন্ত্রণের অনুমতি দেয় এবং (আমার ব্যক্তিগত অভিজ্ঞতায়) দীর্ঘমেয়াদে মাথাব্যথার কারণ সম্ভবত।

তত্ত্ব অনুসারে, আপনি সরাসরি ব্যবহার করে সংশ্লিষ্ট বৈশিষ্ট্যগুলি সেট করতে পারেন set_target_propertiesতবে target_compile_optionsসাধারণত আরও পাঠযোগ্য read

উদাহরণস্বরূপ, আপনি fooলিখতে পারেন এমন জেনারেটর এক্সপ্রেশন ব্যবহার করে কনফিগারেশনের উপর ভিত্তি করে একটি লক্ষ্য সংকলনের বিকল্পগুলি সেট করতে:

target_compile_options(foo PUBLIC "$<$<CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>")
target_compile_options(foo PUBLIC "$<$<CONFIG:RELEASE>:${MY_RELEASE_OPTIONS}>")

PUBLIC, PRIVATE, এবং INTERFACEকিওয়ার্ড নির্ধারণ অপশন পরিধি । যেমন, আমরা লিঙ্ক করেন fooমধ্যে barদিয়ে target_link_libraries(bar foo):

  • PRIVATEবিকল্পগুলি কেবলমাত্র লক্ষ্যমাত্রায় প্রয়োগ করা হবে ( fooএবং এটির সাথে লিঙ্ক করা অন্যান্য গ্রন্থাগারগুলিতে (গ্রাহকরা নয়)।
  • INTERFACE বিকল্পগুলি কেবল গ্রাসকারী লক্ষ্যমাত্রায় প্রয়োগ করা হবে bar
  • PUBLICমূল লক্ষ্য fooএবং গ্রাহক লক্ষ্য উভয় ক্ষেত্রে বিকল্প প্রয়োগ করা হবেbar

12
লক্ষ্য করুন target_compile_options অ্যাড বিকল্প, তাই আপনার মত শেষ লাইনটি পরিবর্তন করতে পারেন এই এটি আরো পাঠযোগ্য) করতে

4
@ComicSansMS দুর্দান্ত উত্তর এবং আমি ইন্টারনেটে যে সন্ধান করতে পারি তার সেরা (এবং সর্বাধিক আধুনিক) ধন্যবাদ!
Ela782

4
@ user3667089 লক্ষ্য-নির্দিষ্ট বৈশিষ্ট্যগুলি সাধারণত কোনও ভেরিয়েবল বা ডিরেক্টরি সম্পত্তি দ্বারা সূচনা হয়। সংশ্লিষ্ট সম্পত্তির ম্যানপেজটি আপনাকে সঠিকভাবে জানায়। সংকলন বিকল্পগুলির ক্ষেত্রে COMPILE_OPTIONSডিরেক্টরি সম্পত্তি এটি করে। এটি add_compile_optionsসেট করতে আপনি কমান্ডটি ব্যবহার করতে পারেন । যে বিকল্পগুলির জন্য এটি একটি ভাল পদ্ধতির হয় সেগুলি সাধারণত খুব কম এবং এর মধ্যে থাকে।
কমিকসান্সএসএমএস

6
@ComicSansMS ব্যবহার কি PUBLICমধ্যে target_compile_options?
রমনা রেড্ডি

4
@ রমনারেডি আমি উত্তরের মূলশব্দটির অতিরিক্ত ব্যাখ্যা যুক্ত করেছি PUBLIC
স্টিফান প্রোফ্যান্টার

0

তিনটি উপায়ে সার্ভার বিভিন্ন উদ্দেশ্যে কাজ করে, তাই অন্যদের চেয়ে সাধারণভাবে কোনওটিই পছন্দ হয় না। CMAKE_<LANG>_FLAGSপরিবর্তনশীল একটি ব্যবহারকারী যখন একটি প্রকল্পের জন্য CMake কলিং পতাকা পাস সংজ্ঞায়িত করতে পারেন। অন্য দুটি প্রকল্পের মধ্যে ব্যবহার করা হয়। একটি নির্দিষ্ট টার্গেটের জন্য পতাকা সেট করা, অন্যটি পুরো ডিরেক্টরি বা জেনারেটরের এক্সপ্রেশনের জন্য।

সম্পর্কিত প্রশ্ন: add_compile_options এবং SET (CMAKE_CXX_FLAGS ...) এর মধ্যে পার্থক্য


4
সংযুক্ত প্রশ্নটি target_compile_optionsউপায় ব্যাখ্যা করে না । আইএমএইচওকে target_compile_optionsঅগ্রাধিকার দেওয়া উচিত কারণ এটি বিকল্পগুলির সূক্ষ্ম-দানা নিয়ন্ত্রণের অনুমতি দেয় এবং এটি জেনারেটর এক্সপ্রেশনগুলি ব্যবহারের অনুমতি দেয়। add_compile_optionsপতাকা ডিরেক্টরি-প্রশস্ত সেট করে। আপনি কি এই উত্তরটি নিজের উত্তরটি আরও খানিকটা ব্যাখ্যা করতে পারেন? এছাড়াও বিভিন্ন সাইট রয়েছে যেখানে এটি উল্লেখ করা হয়েছে যা target_compile_optionsপছন্দ করা উচিত।
স্টিফান প্রোফান্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.