সিএমকে-তে অন্তর্ভুক্ত_নির্দেশ এবং টার্গেট_সামান্য_ ডিরেক্টরিতে পার্থক্য কী?


134

আমার সি ++ কোডের জন্য আমার একটি ডিরেক্টরি কাঠামো রয়েছে যা এটি এর মতো চলে:

|
|->include
|->src

আমি আমার কোডের জন্য একটি CMakeLists.txt ফাইল লিখছি। আমি মধ্যে include_directoriesএবং target_include_directoriesমধ্যে পার্থক্য বুঝতে চাই CMake

তাদের ব্যবহারের মধ্যে পার্থক্য কী এবং আমার অন্তর্ভুক্ত ফাইলের পাথটি যুক্ত করতে আমার কোনটি ব্যবহার করা উচিত?


4
আপনি কি include_directoriesএবং এর জন্য ডকুমেন্টেশন পড়েছেন target_include_directories? এগুলির মধ্যে পার্থক্য সম্পর্কে আপনি কী বুঝতে পারছেন না?
কিছু প্রোগ্রামার ড্যুড

74
ডকুমেন্টেশনে কোনও স্পষ্টতা নেই। আমি এটি পড়েছি এবং অ্যাঞ্জু তার উত্তরে যা লিখেছেন তা অনুধাবন করেছিলাম, তবে প্রকল্পের নির্মাণের জন্য বোঝানো কোনও সিস্টেমের উদাহরণ, উদাহরণ নেই এবং সিএমকে ডকুমেন্টেশনে কোনও প্রকল্প ভিত্তিক উদাহরণ নেই। সিএমকেকের একটি ভাল এবং পরিপূর্ণ ডকুমেন্টেশন থাকলে আমি এই প্রশ্নগুলি নিয়ে সম্প্রদায়কে বোঝা করতাম না।
উজ্জ্বল আর্য

চতুর ধারণাগুলি খারাপভাবে নথিভুক্ত করা হয়। বিশেষত লক্ষ্যবস্তু এবং "অবহেলিত"।
জন গ্রিন

উত্তর:


148

include_directories(x/y)ডিরেক্টরি সুযোগ প্রভাবিত করে। এই সিএমকেলিস্টে সমস্ত লক্ষ্যবস্তু, পাশাপাশি তার আহ্বানের পয়েন্টের পরে যুক্ত সমস্ত সাব-ডাইরেক্টরিগুলিতে, x/yতাদের অন্তর্ভুক্তির পথে যুক্ত হবে পথ।

target_include_directories(t x/y)লক্ষ্য সুযোগ আছে - এটি x/yলক্ষ্য জন্য অন্তর্ভুক্ত পথ যোগ করে t

আপনি যদি পূর্ববর্তীটি চান তবে আপনার সমস্ত লক্ষ্যগুলি প্রশ্নযুক্ত অন্তর্ভুক্ত ডিরেক্টরিগুলি ব্যবহার করে। আপনি যদি পথটি কোনও লক্ষ্যের সাথে নির্দিষ্ট করে থাকেন বা আপনি যদি পথের দৃশ্যমানতার আরও ভাল নিয়ন্ত্রণ চান তবে আপনি পরবর্তীটি চান। আধুনিক সত্য যে থেকে আসে target_include_directories()সমর্থন PRIVATE, PUBLICএবং INTERFACEকোয়ালিফায়ার।


35
আমি মনে করি যে উত্তরোত্তরটিকে সাধারণত পছন্দ করা উচিত (যতক্ষণ না কেউ চতুর 3 ব্যবহার করেন)। এটা তোলে নির্বাণ যোগ সুবিধা রয়েছে x/yযে কোন নির্ভরশীল লক্ষ্যমাত্রা ব্যবহার পথে অন্তর্ভুক্ত tতাদের মধ্যে target_link_librariesকমান্ড। অবশ্যই পূর্বের জন্য একটি জায়গা আছে, তবে আমি বিশ্বাস করি যে উত্তরটি পরে ভাল হয়।
ফিল

2
মূল উত্তরটি বলেছিল যে কেবলমাত্র টার্গেট এবং সাবডিয়ারগুলি পরে যুক্ত include_directoriesহবে তা প্রভাবিত হবে। আমি উত্তরটি সম্পাদনা করছি: ডকুমেন্টেশনে পরিষ্কারভাবে বলা হয়েছে যে বর্তমান সিএমকেলিস্টে সমস্ত লক্ষ্যমাত্রা প্রভাবিত হয়েছে। ডকুমেন্টেশনে কলটি প্রভাবিত হওয়ার পরে কেবল সাবডিয়ারদের উল্লেখ করা হয়নি (যেমন মূল
উত্তরটিতে

@ ফিল, target_include_directoriesসিএমকে ২.৮.১১ (মে 2013)
টামাস.কেনেজ

@ tamas.kenez এটি আমার নজরে আনার জন্য ধন্যবাদ, স্থির। আমি যথেষ্ট নিশ্চিত হয়েছি এটি "এখন থেকে" জিনিস was
অ্যাঞ্জিউ আর এগস্ট

40

অ্যাঞ্জের উত্তর সঠিকভাবে যা বলেছে তার পাশাপাশি , আরেকটি খুব গুরুত্বপূর্ণ পার্থক্য include_directoriesএবং target_include_directoriesএটি হ'ল, যখন এর সাথে ব্যবহার করা হয় PUBLICবা INTERFACEপরে INTERFACE_INCLUDE_DIRECTORIES, লক্ষ্যটির সম্পত্তিটি তৈরি করে। এই লক্ষ্যটি কার্যকর হয় যখন অন্য লক্ষ্যটি target_link_librariesমূল টার্গেটের সাথে লিঙ্ক করতে ব্যবহার করে, কারণ লিঙ্কিং টার্গেটটি স্বয়ংক্রিয়ভাবে সেগুলি যুক্ত ডিরেক্টরিগুলি অন্তর্ভুক্ত করে। উদাহরণ দেখুন ।

এই গুরুত্বপূর্ণ বৈশিষ্ট্যটি ডকুমেন্টেশনে খুব ভালভাবে লুকিয়ে রয়েছে: টার্গেট_সামান্য_নির্দেশগুলি জনবসতির কথা উল্লেখ করে INTERFACE_INCLUDE_DIRECTORIES, যার ডকুমেন্টেশন বলে:

টার্গেট_লিঙ্ক_লাইব্রিজ () ব্যবহার করে যখন লক্ষ্য নির্ভরতা নির্দিষ্ট করা হয় , তখন গ্রাহকের বিল্ড বৈশিষ্ট্য নির্ধারণ করতে সিএমকে সমস্ত লক্ষ্য নির্ভরতা থেকে এই সম্পত্তিটি পড়বে।


এই প্রথম যখন আমি PUBLICইত্যাদি বৈশিষ্ট্যগুলির একটি বোধগম্য ব্যাখ্যা পড়ি ! ধন্যবাদ: ডি
আরএল-এস

2

@ অঞ্জিউ যেমন বলেছিলেন, তফাতটি হ'ল:

1, অন্তর্ভুক্ত_ডাইরেক্টরিজ () উত্স-ট্রি 2-এর সমস্ত ফাইলের জন্য অ্যাক্সেসযোগ্য 2, টার্গেট_ক্লিন_ডাইরেক্টরিজ () কেবলমাত্র নির্দিষ্ট টার্গেটের জন্য যখন সংকলন করা যায় তখনই অ্যাক্সেসযোগ্য।

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