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


উত্তর:


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
এর বাস্তব-জগতের উদাহরণের ক্ষেত্রে INTERFACEtarget_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.