শব্দ অর্থ কী PUBLIC
, PRIVATE
এবং INTERFACE
CMake এর সাথে সম্পর্কিত 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
ডকুমেন্টেশনটি আমার নিজের শব্দ দিয়ে পুনরায় প্রকাশ করতে: