আপনি যে প্রশ্নটি যুক্ত করেছেন সেটি "গ্রন্থাগারগুলির সাথে লিঙ্ক বাইনারি" কার্যকারিতা উল্লেখ করে যা এম্বেডড বাইনারি থেকে কিছুটা আলাদা।
"লিঙ্ক বাইনারি উইথ লাইব্রেরি" এর অর্থ আপনি লিঙ্কেজ সম্পর্কিত সম্মানের সাথে কী আশা করেছিলেন: বাইনারি স্থির গ্রন্থাগার, গতিশীল লাইব্রেরি বা ফ্রেমওয়ার্ক কিনা তা নির্বিশেষে সংকলনের পরে লিংক সময়ে এটি আপনার অবজেক্ট কোডের সাথে সংযুক্ত হবে।
আপনি যখন কোনও স্ট্যাটিক লাইব্রেরির সাথে সংযোগের কথা ভাবেন, তখন যা ঘটে তা বেশ স্পষ্ট: লিংককারীটি আপনার আউটপুট বাইনারিটিতে লাইব্রেরি থেকে (যেমন ) কোডটি অনুলিপি করে libFoo.a
। আপনার আউটপুট ফাইলটি আকারে বৃদ্ধি পায় তবে রানটাইমের সময় কোনও বাহ্যিক নির্ভরতা সমাধান করার দরকার নেই। আপনার প্রোগ্রামটি চালানোর জন্য প্রয়োজনীয় সমস্ত কিছু (স্থির গ্রন্থাগারের প্রতি সম্মান সহ) এটি তৈরির পরে উপস্থিত রয়েছে।
একটি ডায়নামিক লাইব্রেরি (.dlib, বা সিস্টেম সরবরাহকৃত কাঠামো) সহ, প্রত্যাশাটি হ'ল আপনি যে লাইব্রেরির সাথে সংযোগ করছেন সেটি আপনার প্রোগ্রামটি চালানোর সময় সিস্টেমের গতিশীল-লাইব্রেরি লোডার পাথের কোথাও উপস্থিত থাকবে। আপনার বাইনারিতে তৃতীয় পক্ষের সমস্ত বাহ্যিক গ্রন্থাগারগুলি অনুলিপি করার জন্য আপনার ওভারহেড নেই এবং সেই লাইব্রেরির সাথে লিঙ্কযুক্ত একটি কম্পিউটারে থাকা সমস্ত বিভিন্ন প্রোগ্রাম এটি খুঁজে পেতে সক্ষম হবে, যা খুব কম ডিস্কের স্থান সাশ্রয় করে, তবে এটিও সিস্টেমটি কোথায় এবং কোথায় লাইব্রেরিগুলি ক্যাশে করে তার উপর নির্ভর করে মেমরির সম্ভাব্য স্থান।
একটি কাঠামো অনেকটা গতিশীল লাইব্রেরির মতো, তবে এর ডিরেক্টরি কাঠামোতে (চিত্র, অডিও, অন্যান্য ফ্রেমওয়ার্ক ইত্যাদি) সংস্থান থাকতে পারে। এক্ষেত্রে একটি সাধারণ স্ট্যাটিক-লাইব্রেরি বা .dlib ফাইল এটি কাটবে না যাতে আপনার কোনও কাঠামোর সাথে লিঙ্ক করতে হতে পারে যাতে এটি সঠিকভাবে চালানোর জন্য কী প্রয়োজন তা খুঁজে পেতে পারে।
আপনি যখন কোনও তৃতীয় পক্ষের কাঠামোর সাথে লিঙ্ক করেন (গিথুব থেকে আপনি ডাউনলোড করেছেন এমন কিছু বলুন এবং নিজেকে তৈরি করেছেন), এটি আপনার চালানোর ইচ্ছায় সিস্টেমটিতে উপস্থিত নাও হতে পারে। এই ক্ষেত্রে, আপনি কেবল কাঠামোর সাথে লিঙ্ক করবেন না, তবে আপনার অ্যাপ্লিকেশন বান্ডেলের ভিতরে এম্বেড করার পাশাপাশি "অনুলিপি ফ্রেমওয়ার্কগুলি" পর্বটি ব্যবহার করবেন। যখন আপনার প্রোগ্রামটি চলবে, রানটাইম-লিঙ্কার (ওরফে রিসলভার) সিস্টেমের লোডার পাথের পাশাপাশি আপনার বান্ডেলের ভিতরে নজর রাখবে, এমবেডেড ফ্রেমওয়ার্কটি সন্ধান করবে এবং এটি লিঙ্ক করবে যাতে চালানোর জন্য আপনার অ্যাপ্লিকেশনটির কোড থাকতে পারে।
অবশেষে, "এম্বেডড বাইনারি" সঠিকভাবে যা কার্যকর হয় আপনি উভয়ই একটি অনুলিপি-ফাইল ফেজের মাধ্যমে আপনার অ্যাপ্লিকেশন বান্ডেলে এম্বেড করে থাকেন এবং সম্ভবত আপনি নিজেই চালিত হন, সম্ভবত কোনও কল popen()
বা অনুরূপ সাথে। এম্বেড করা বাইনারি আপনার প্রোগ্রাম দ্বারা কল করা যেতে পারে, তবে এটি এর সাথে লিঙ্কযুক্ত নয়। এটি একটি সম্পূর্ণ বাহ্যিক সত্তা ( /bin
ডিরেক্টরিতে প্রোগ্রামগুলির মতো )।
অনুশীলনে, সিস্টেম-সরবরাহিত লাইব্রেরি এবং ফ্রেমওয়ার্কগুলির জন্য আপনি তাদের বিরুদ্ধে লিঙ্ক করবেন এবং আপনাকে যা করতে হবে তা কেবল।
আপনার যদি নির্মিত একটি লাইব্রেরি লিঙ্ক করতে হয় যা কোনও এম্বেড থাকা সংস্থার প্রয়োজন নেই (অর্থাত্ কোনও কাঠামোর প্রয়োজন নেই), তবে আপনি কেবল একটি স্ট্যাটিক লাইব্রেরির সাথে লিঙ্ক করতে পারেন। যদি আপনি দেখতে পান যে আপনার প্রোগ্রামে আপনার একাধিক মডিউল রয়েছে যা একই লাইব্রেরি কোডটি ব্যবহার করতে চায়, তবে এটিকে কোনও ফ্রেমওয়ার্ক বা গতিশীল লাইব্রেরিতে রূপান্তর করা এবং এর বিপরীতে লিঙ্কিং করা স্থান বাঁচাতে পারে এবং সুবিধাজনক হতে পারে (বিশেষত যদি স্মৃতি ব্যবহারের উদ্বেগ থাকে)।
পরিশেষে, ফ্রেমওয়ার্কগুলিতে কেবল সংস্থানগুলি নয়, শিরোনাম এবং / অথবা লাইসেন্স ফাইল অন্তর্ভুক্ত থাকতে পারে। এই ফাইলগুলি জানাতে একটি কাঠামো ব্যবহার করা আসলে একটি সুবিধাজনক বিতরণ প্রক্রিয়া তাই প্রায়শই আপনি একটি কাঠামো অন্তর্ভুক্ত করতে চাইতে পারেন কেবল এই জিনিসগুলি আপনার বাইনারি সহ ট্যাগ করতে পারে (যেমন লাইসেন্সের প্রয়োজনীয়তাগুলি এটি বাধ্যতামূলক করতে পারে)।
--- সম্পাদনা ---
অ্যাডাম জনস নীচের প্রশ্নটি মন্তব্য হিসাবে পোস্ট করেছেন:
এটি একটি দুর্দান্ত উত্তর। তবে আমি এখনও কিছুটা বিভ্রান্ত হয়েছি এমন কিছু আছে। বাইনারি নিজেই চালিত করার অর্থ কী? আপনি কি কেবল এম্বেড থাকা কাঠামোর কোডটিই বোঝাতে চান? আমি জানি আপনি পপেন () উল্লেখ করেছেন, তবে আপনি বলছেন যে আমার অ্যাপটি পপেন () কে কল করছে? আমি আসলে কী তা বুঝতে পারি না।
আমি বলছি একটি এম্বেডেড বাইনারি হ'ল অডিও ফাইল বা চিত্রের মতো আপনার বান্ডিলের অন্য একটি রিসোর্স ফাইল, যদিও ফাইলটি পরিবর্তে এক্সিকিউটেবল কমান্ড-লাইন সরঞ্জাম is popen()
ফাংশন ( man popen
আপনার টার্মিনাল কাছ থেকে আরও পড়তে এটি সম্পর্কে) আপনি অন্য চলমান প্রোগ্রাম থেকে নির্বিচারে প্রোগ্রামসমূহ চালানোর সুযোগ দিবে। system()
ফাংশন অন্য উপায়। অন্যরাও রয়েছেন, এবং আমি এখানে একটি historicalতিহাসিক উদাহরণ দেব যা এম্বেডড বাইনারিটির বোঝার ব্যবহারকে আরও কিছুটা পরিষ্কার করতে পারে:
আপনি সম্ভবত সচেতন হিসাবে, আপনি যখন ম্যাক ওএস এক্সে কোনও অ্যাপ্লিকেশন চালু করেন এটি বর্তমান ব্যবহারকারীর আইডি দিয়ে চালু করা হয়। বেশিরভাগ সাধারণ ইনস্টলেশনের অধীনে এটিই ডেস্কটপ admin
ব্যবহারকারী -এ-ডিফল্ট ব্যবহারকারী, যাকে ব্যবহারকারী আইডি দেওয়া হয় 501
।
ইউনিক্স-ভিত্তিক অপারেটিং সিস্টেমগুলিতে কেবলমাত্র root
ব্যবহারকারী (ব্যবহারকারী আইডি 0
) পুরো ফাইল সিস্টেমে সম্পূর্ণ অ্যাক্সেস পায়। কখনও কখনও এটি ঘটে যে ডেস্কটপ ব্যবহারকারী দ্বারা চালু করা একটি ইনস্টলার প্রোগ্রামের জন্য কোনও সুবিধাযুক্ত ডিরেক্টরিতে ফাইল ইনস্টল করা প্রয়োজন (উদাহরণস্বরূপ ড্রাইভার)। এই ক্ষেত্রে, অ্যাপ্লিকেশন প্রোগ্রামটির root
ব্যবহারকারীর কাছে তার সুবিধাগুলি বাড়ানো দরকার যাতে এটি এই বিধিনিষেধযুক্ত ডিরেক্টরিতে লিখতে পারে।
ওএস এক্স ১০.7 এর মাধ্যমে অপারেটিং সিস্টেমে এটির সুবিধার্থে অ্যাপল তার অনুমোদন পরিষেবাদি এপিআই -তে প্রামাণিকতা এক্সিকিউটিউইথপ্রাইভিলিজ () এটি সরবরাহ করেছে (এটি এখন অবচিত, তবে এটি এখনও একটি দরকারী উদাহরণ)।
AuthorizationExecuteWithPrivileges()
যুক্তি হিসাবে কার্যকর করার জন্য একটি কমান্ড-লাইন সরঞ্জামের পথ নিয়েছিল root
। কমান্ড লাইন সরঞ্জামটি ছিল একটি এক্সিকিউটেবল শেল স্ক্রিপ্ট বা সংকলিত বাইনারি যা আপনি নিজের ইনস্টল যুক্তি চালানোর জন্য লিখেছিলেন। এই সরঞ্জামটি আপনার অ্যাপ্লিকেশন বান্ডেলের অভ্যন্তরে অন্যান্য সংস্থান ফাইলের মতো ইনস্টল করা হয়েছিল।
যখন ডাকা হয়, ওএস ব্যবহারকারীর পাসওয়ার্ড জিজ্ঞাসা করার জন্য একটি অনুমোদন ডায়ালগ স্থাপন করে (আপনি এটি আগে দেখেছেন!) এবং প্রবেশ root
করার পরে আপনার অ্যাপ্লিকেশনটির পক্ষ থেকে প্রোগ্রামটি কার্যকর করা হবে । এই প্রক্রিয়াটি কেবল popen()
নিজের সাথে একটি প্রোগ্রাম চালানোর অনুরূপ , যদিও popen()
একা আপনাকে সুবিধাবঞ্চিত বৃদ্ধির সুবিধা দেয় না।