সিএমকে টার্গেট_মিলন_ডাইরেক্টরিগুলি স্কোপটির অর্থ


উত্তর:


124

আপনি কী লক্ষ্যবস্তুতে যাচ্ছেন সেই অন্তর্ভুক্ত ডিরেক্টরিগুলির তালিকা কখন প্রয়োজন হবে তা বলার জন্য এই কীওয়ার্ডগুলি ব্যবহৃত হয় । দ্বারা যখন তার মানে যদি ঐ অন্তর্ভুক্ত ডিরেক্টরি প্রয়োজন হয়:

  • যে লক্ষ্যটি নিজেই সংকলন করতে।
  • সেই লক্ষ্যটির উপর নির্ভরশীল অন্যান্য লক্ষ্যগুলি সংকলন করতে (যেমন এর সর্বজনীন শিরোনাম ব্যবহার করে)।
  • উপরের উভয় পরিস্থিতিতে।

যখন 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.০ ডকুমেন্টেশনে এই বিল্ডের স্পেসিফিকেশন এবং ব্যবহারের প্রয়োজনীয়তার বৈশিষ্ট্যগুলির বিষয়ে আরও বিশদ রয়েছে ।


18
এর বাস্তব-জগতের উদাহরণের ক্ষেত্রে INTERFACE। target_include_directories(libname INTERFACE include PRIVATE include/libname)। এর অর্থ হল আপনার লাইব্রেরির মধ্যে আপনি সরাসরি ফাইলগুলি অন্তর্ভুক্ত করতে পারেন তবে লাইব্রেরির ব্যবহারকারী হিসাবে আপনাকে libname/প্রথমে sert োকাতে হবে।
— KaareZ

4
এই উত্তরগুলি লাইব্রেরি তৈরির জন্য আমার কাছে অর্থবোধ করে। কিন্তু কীভাবে টার্গেটের জন্য টার্গেট_ইনক্লাইড_ডাইরেক্টরিগুলি কল করা যা কার্যকর করা যায়?
— নরম্যান পেলেট

4
@ নরম্যানপেললেট: আপনি target_include_directories()যদি নির্ধারিত টার্গেটের জন্য ডাইরেক্টরিগুলি অন্তর্ভুক্ত করতে চান যেখানে এই এক্সিকিউটেবলের দ্বারা ব্যবহৃত হেডার ফাইলগুলি সন্ধান করতে হয় (উদাহরণস্বরূপ: বুস্ট :: প্রোগ্রাম_অপশনগুলি, যদি আপনি এটি আপনার main()ফাংশনে যুক্তি পার্স করার জন্য ব্যবহার করেন ) । আপনি সম্ভবত PRIVATEএই ক্ষেত্রে কীওয়ার্ডটি ব্যবহার করতে পারেন , যেমন এই এক্সিকিউটেবল নিজেই সংকলন করার জন্য এই ফাইলগুলির প্রয়োজন। যদিও আমি জানি না যে কোনও এক্সিকিউটেবলের জন্য INTERFACEবা এর কিছু ব্যবহার আছে কিনা PUBLIC।
— টিএমহানতে

13

ইন্টারফেস, পাবলিক এবং প্রাইভেট কীওয়ার্ডগুলির নিম্নলিখিত আর্গুমেন্টগুলির ক্ষেত্র নির্দিষ্ট করতে প্রয়োজনীয়। প্রাইভেট এবং পাবলিক আইটেমগুলি <টার্গেট> এর INCLUDE_DIRECTORIES সম্পত্তি রচনা করবে। পাবলিক এবং ইন্টারফেস আইটেমগুলি <টার্গেট> এর INTERFACE_INCLUDE_DIRECTORIES বৈশিষ্ট্যকে পপুলেট করবে। নিম্নলিখিত যুক্তি ডিরেক্টরি অন্তর্ভুক্ত উল্লেখ করে।

ডকুমেন্টেশন থেকে: http://www.cmake.org/cmake/help/v3.0/command/target_incolve_directories.html

ডকুমেন্টেশনটি আমার নিজের শব্দ দিয়ে পুনরায় প্রকাশ করতে:

  • আপনি একটি লক্ষ্য অন্তর্ভুক্ত ডিরেক্টরি অন্তর্ভুক্ত তালিকা একটি ডিরেক্টরি যুক্ত করতে চান
  • PRIVATE সহ ডিরেক্টরিটি লক্ষ্যবস্তু অন্তর্ভুক্ত ডিরেক্টরিগুলিতে যুক্ত করা হয়
  • ইন্টারফেসের সাথে লক্ষ্যটি সংশোধন করা হয়নি, তবে ইন্টারফ্যাকE_INCLUDE_DIRECTORIES ডিরেক্টরি দ্বারা প্রসারিত। ভেরিয়েবলটি একটি লাইব্রেরির জন্য ডিরেক্টরি অন্তর্ভুক্ত ডিরেক্টরিগুলির তালিকা।
  • পাবলিকের সাথে প্রাইভেট এবং ইন্টারফেস উভয় ক্রিয়া সম্পাদন করা হয়।

4
আমি সিএমএকেই ডকুমেন্টেশনের মধ্য দিয়ে গিয়েছিলাম, তবে আমি এখনও পাইনি যে তারা আসলে কী বোঝায় এবং কোন প্রসঙ্গে (ফাইলগুলি তৈরি করে বা কীভাবে তারা সংকলন করেছিল)?
— সিরিশ

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