শব্দ অর্থ কী PUBLIC, PRIVATEএবং INTERFACECMake এর সাথে সম্পর্কিত target_include_directories?
উত্তর:
আপনি কী লক্ষ্যবস্তুতে যাচ্ছেন সেই অন্তর্ভুক্ত ডিরেক্টরিগুলির তালিকা কখন প্রয়োজন হবে তা বলার জন্য এই কীওয়ার্ডগুলি ব্যবহৃত হয় । দ্বারা যখন তার মানে যদি ঐ অন্তর্ভুক্ত ডিরেক্টরি প্রয়োজন হয়:
যখন CMake একটি টার্গেট সংকলন করা হয়, এটা লক্ষ্যমাত্রা ব্যবহার INCLUDE_DIRECTORIES, COMPILE_DEFINITIONSএবং COMPILE_OPTIONSবৈশিষ্ট্য। আপনি যখন PRIVATEকীওয়ার্ডটি target_include_directories()এবং একইভাবে ব্যবহার করেন , আপনি সিএমকে এই লক্ষ্যযুক্ত বৈশিষ্ট্যগুলি বিশিষ্ট করতে বলুন।
CMake একটি টার্গেট A এবং অন্য লক্ষ্য বি (যখন আপনি ব্যবহার মত মধ্যে একটি নির্ভরতা সনাক্ত করে যখন target_link_libraries(A B)কমান্ড), এটা transitively propagates B ব্যবহার প্রয়োজনীয়তা থেকে Aলক্ষ্য। সেই লক্ষ্য ব্যবহারের প্রয়োজনীয়তা দিক তুমি সরাসরি কম্পাইল সংজ্ঞা, ইত্যাদি অন্তর্ভুক্ত হয় কোনো লক্ষ্য যে উপর নির্ভর করে যে Bআবশ্যক দেখা। এগুলি INTERFACE_*উপরে বর্ণিত বৈশিষ্ট্যের সংস্করণ (যেমন INTERFACE_INCLUDE_DIRECTORIES) দ্বারা নির্দিষ্ট করা হয়েছে INTERFACEএবং target_*()কমান্ডগুলি কল করার সময় কীওয়ার্ড ব্যবহার করে পপুলেটেড হয় ।
PUBLICশব্দ মোটামুটিভাবে মানে PRIVATE + INTERFACE।
সুতরাং, ধরুন আপনি এমন একটি লাইব্রেরি তৈরি করছেন Aযা কিছু বুস্ট শিরোনাম ব্যবহার করে। আপনি করবেন:
target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})যদি আপনি কেবলমাত্র আপনার উত্স ফাইলগুলিতে ( .cpp) বা ব্যক্তিগত হেডার ফাইলগুলি ( .h) এর মধ্যে সেই বুস্ট শিরোনাম ব্যবহার করেন ।target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})যদি আপনি আপনার উত্স ফাইলগুলির মধ্যে সেই বুস্ট শিরোনাম ব্যবহার না করেন (অতএব, তাদের সংকলনের প্রয়োজন নেই A)। আমি আসলে এটির জন্য একটি বাস্তব-বিশ্বের উদাহরণ সম্পর্কে ভাবতে পারি না।target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})যদি আপনি আপনার সর্বজনীন হেডার ফাইলগুলিতে সেই বুস্ট শিরোনাম ব্যবহার করেন, যা কিছু Aউত্স ফাইলগুলিতে উভয়ই অন্তর্ভুক্ত রয়েছে এবং এটি আপনার Aগ্রন্থাগারের অন্য কোনও ক্লায়েন্টের অন্তর্ভুক্ত থাকতে পারে ।সিএমেক 3.0.০ ডকুমেন্টেশনে এই বিল্ডের স্পেসিফিকেশন এবং ব্যবহারের প্রয়োজনীয়তার বৈশিষ্ট্যগুলির বিষয়ে আরও বিশদ রয়েছে ।
INTERFACE। target_include_directories(libname INTERFACE include PRIVATE include/libname)। এর অর্থ হল আপনার লাইব্রেরির মধ্যে আপনি সরাসরি ফাইলগুলি অন্তর্ভুক্ত করতে পারেন তবে লাইব্রেরির ব্যবহারকারী হিসাবে আপনাকে libname/প্রথমে sert োকাতে হবে।
target_include_directories()যদি নির্ধারিত টার্গেটের জন্য ডাইরেক্টরিগুলি অন্তর্ভুক্ত করতে চান যেখানে এই এক্সিকিউটেবলের দ্বারা ব্যবহৃত হেডার ফাইলগুলি সন্ধান করতে হয় (উদাহরণস্বরূপ: বুস্ট :: প্রোগ্রাম_অপশনগুলি, যদি আপনি এটি আপনার main()ফাংশনে যুক্তি পার্স করার জন্য ব্যবহার করেন ) । আপনি সম্ভবত PRIVATEএই ক্ষেত্রে কীওয়ার্ডটি ব্যবহার করতে পারেন , যেমন এই এক্সিকিউটেবল নিজেই সংকলন করার জন্য এই ফাইলগুলির প্রয়োজন। যদিও আমি জানি না যে কোনও এক্সিকিউটেবলের জন্য INTERFACEবা এর কিছু ব্যবহার আছে কিনা PUBLIC।
ইন্টারফেস, পাবলিক এবং প্রাইভেট কীওয়ার্ডগুলির নিম্নলিখিত আর্গুমেন্টগুলির ক্ষেত্র নির্দিষ্ট করতে প্রয়োজনীয়। প্রাইভেট এবং পাবলিক আইটেমগুলি <টার্গেট> এর INCLUDE_DIRECTORIES সম্পত্তি রচনা করবে। পাবলিক এবং ইন্টারফেস আইটেমগুলি <টার্গেট> এর INTERFACE_INCLUDE_DIRECTORIES বৈশিষ্ট্যকে পপুলেট করবে। নিম্নলিখিত যুক্তি ডিরেক্টরি অন্তর্ভুক্ত উল্লেখ করে।
ডকুমেন্টেশন থেকে: http://www.cmake.org/cmake/help/v3.0/command/target_incolve_directories.html
ডকুমেন্টেশনটি আমার নিজের শব্দ দিয়ে পুনরায় প্রকাশ করতে: