ios - কখন আমাদের এক্সকোডে "লিঙ্কযুক্ত ফ্রেমওয়ার্ক" না দিয়ে "এম্বেডেড বাইনারিগুলি" ব্যবহার করা উচিত?




xcode frameworks (2)

লাইব্রেরি ভিএস এম্বেড ফ্রেমওয়ার্কগুলির সাথে লিঙ্ক বাইনারিতে বর্ণিত হিসাবে এই দুটি বিকল্পের মধ্যে পার্থক্য সম্পর্কে একটি ভাল প্রশ্ন রয়েছে।

দেখে মনে হচ্ছে আমাদের উভয়টিকেই ব্যবহার করার বিকল্প রয়েছে, কেবল অবাক করে নিন যে কোন ক্ষেত্রে আমাদের এম্বেডড বাইনারিগুলি আরও ভালভাবে ব্যবহার করা উচিত, না লিঙ্কযুক্ত কাঠামোর চেয়ে?

আরও সুস্পষ্টভাবে সম্বোধনের জন্য কোন শক্ত উদাহরণ? ধন্যবাদ

https://code.i-harness.com


আপনি যে প্রশ্নটি যুক্ত করেছেন সেটি "গ্রন্থাগারগুলির সাথে লিঙ্ক বাইনারি" কার্যকারিতা উল্লেখ করে যা এম্বেডড বাইনারি থেকে কিছুটা আলাদা।

"লিঙ্ক বাইনারি উইথ লাইব্রেরি" এর অর্থ লিঙ্কেজ সম্পর্কিত আপনি কী চাইবেন: বাইনারি স্থির গ্রন্থাগার, গতিশীল লাইব্রেরি বা ফ্রেমওয়ার্ক কিনা তা নির্বিশেষে সংকলনের পরে লিংক সময়ে এটি আপনার অবজেক্ট কোডের সাথে সংযুক্ত হবে।

আপনি যখন কোনও স্ট্যাটিক লাইব্রেরির সাথে সংযোগের কথা ভাবেন, তখন যা ঘটে তা বেশ স্পষ্ট: libFoo.a আপনার আউটপুট বাইনারিটিতে লাইব্রেরি থেকে (যেমন libFoo.a ) কোডটি অনুলিপি করে। আপনার আউটপুট ফাইলটি আকারে বৃদ্ধি পায় তবে রানটাইমের সময় কোনও বাহ্যিক নির্ভরতা সমাধান করার দরকার নেই। আপনার প্রোগ্রামটি চালানোর জন্য প্রয়োজনীয় সমস্ত কিছু (স্থির গ্রন্থাগারের প্রতি সম্মান সহ) এটি তৈরির পরে উপস্থিত রয়েছে।

একটি ডায়নামিক লাইব্রেরি (.dlib, বা সিস্টেম-সরবরাহকৃত কাঠামো) সহ, প্রত্যাশাটি হ'ল আপনি যে লাইব্রেরির সাথে সংযোগ করছেন সেটি আপনার প্রোগ্রামটি চালানোর সময় সিস্টেমের গতিশীল-লাইব্রেরি লোডার পথে কোথাও উপস্থিত থাকবে। আপনার বাইনারিটিতে তৃতীয় পক্ষের সমস্ত বাহ্যিক গ্রন্থাগারগুলি অনুলিপি করার উপরিভাগ আপনার কাছে নেই এবং সেই লাইব্রেরির সাথে লিঙ্কযুক্ত একটি কম্পিউটারে থাকা সমস্ত বিভিন্ন প্রোগ্রাম এটি খুঁজে পেতে সক্ষম হবে, যা খুব কম ডিস্কের স্থান সাশ্রয় করে, তবে এটিও সিস্টেমটি কোথায় এবং কোথায় লাইব্রেরিগুলিকে ক্যাশে করে তার উপর নির্ভর করে মেমরির সম্ভাব্য স্থান।

একটি কাঠামো অনেকটা গতিশীল লাইব্রেরির মতো, তবে এটির ডিরেক্টরি কাঠামোতে (চিত্রগুলি, অডিও, অন্যান্য ফ্রেমওয়ার্ক ইত্যাদি) সংস্থান থাকতে পারে। এক্ষেত্রে একটি সাধারণ স্ট্যাটিক-লাইব্রেরি বা .dlib ফাইল এটি কাটবে না যাতে আপনার কোনও কাঠামোর সাথে লিঙ্ক করতে হতে পারে যাতে এটি সঠিকভাবে চালানোর জন্য কী প্রয়োজন তা খুঁজে পেতে পারে।

আপনি যখন কোনও তৃতীয় পক্ষের কাঠামোর সাথে লিঙ্ক করেন (গিথুব থেকে আপনি ডাউনলোড করেছেন এমন কিছু বলুন এবং নিজেকে তৈরি করেছেন), এটি আপনার চালানোর ইচ্ছায় সিস্টেমটিতে উপস্থিত নাও হতে পারে। এই ক্ষেত্রে, আপনি কেবল কাঠামোর সাথেই লিঙ্ক করবেন না, তবে আপনার অ্যাপ্লিকেশন বান্ডেলের ভিতরে এম্বেড করার পাশাপাশি "অনুলিপি ফ্রেমওয়ার্কগুলি" পর্বটি ব্যবহার করবেন। যখন আপনার প্রোগ্রামটি চলবে, রানটাইম-লিঙ্কার (ওরফে রিসলভার) সিস্টেমের লোডার পাথের পাশাপাশি আপনার বান্ডেলের ভিতরে নজর রাখবে, এমবেডড ফ্রেমওয়ার্কটি সন্ধান করবে এবং এটি লিঙ্ক করবে যাতে চালানোর জন্য আপনার অ্যাপ্লিকেশনটির কোডটি থাকতে পারে।

অবশেষে, কোনও "এমবেডড বাইনারি" সঠিকভাবে হ'ল একটি এক্সিকিউটেবল হ'ল আপনি উভয়ই একটি অনুলিপি-ফাইল ফেজের মাধ্যমে আপনার অ্যাপ্লিকেশন বান্ডেলে এম্বেড করেছেন এবং আপনি popen() করতে popen() , সম্ভবত popen() বা অনুরূপ কল দিয়ে। এম্বেড করা বাইনারি আপনার প্রোগ্রাম দ্বারা কল করা যেতে পারে, তবে এটি এর সাথে লিঙ্কযুক্ত নয়। এটি সম্পূর্ণ বাহ্যিক সত্তা ( /bin ডিরেক্টরিতে প্রোগ্রামগুলির মতো)।

অনুশীলনে, সিস্টেম-সরবরাহিত লাইব্রেরি এবং ফ্রেমওয়ার্কগুলির জন্য আপনি তাদের বিরুদ্ধে লিঙ্ক করবেন এবং এটাই আপনাকে করার দরকার।

আপনার যদি নির্মিত একটি লাইব্রেরি লিঙ্ক করতে হয় যা কোনও এম্বেড থাকা সংস্থার প্রয়োজন নেই (অর্থাত্ কোনও কাঠামোর প্রয়োজন নেই), তবে আপনি কেবল একটি স্ট্যাটিক লাইব্রেরির সাথে লিঙ্ক করতে পারেন। যদি আপনি দেখতে পান যে আপনার প্রোগ্রামে আপনার একাধিক মডিউল রয়েছে যা একই লাইব্রেরি কোডটি ব্যবহার করতে চায়, তবে এটিকে কোনও ফ্রেমওয়ার্ক বা ডায়নামিক লাইব্রেরিতে রূপান্তর করা এবং এর বিপরীতে লিঙ্কিং করা স্থান বাঁচাতে পারে এবং সুবিধাজনক হতে পারে (বিশেষত স্মৃতিশক্তি ব্যবহার যদি উদ্বেগজনক হয়)।

পরিশেষে, ফ্রেমওয়ার্কগুলিতে কেবল সংস্থানগুলি নয়, শিরোনাম এবং / অথবা লাইসেন্স ফাইল অন্তর্ভুক্ত থাকতে পারে। এই ফাইলগুলি জানাতে একটি কাঠামো ব্যবহার করা আসলে একটি সুবিধাজনক বিতরণ প্রক্রিয়া তাই প্রায়শই আপনি একটি কাঠামো অন্তর্ভুক্ত করতে চাইতে পারেন যাতে এই জিনিসগুলি আপনার বাইনারি সহ ট্যাগ করতে পারে (যেমন লাইসেন্সের প্রয়োজনীয়তাগুলি এটি বাধ্যতামূলক করতে পারে)।

--- সম্পাদনা ---

অ্যাডাম জনস নীচের প্রশ্নটি মন্তব্য হিসাবে পোস্ট করেছেন:

এটি একটি দুর্দান্ত উত্তর। তবে আমি এখনও কিছুটা বিভ্রান্ত হয়েছি এমন কিছু আছে। বাইনারি নিজেই চালিত করার অর্থ কী? আপনি কি এম্বেড থাকা কাঠামোর কোডটি সহজেই বোঝাতে চান? আমি জানি আপনি পপেন () উল্লেখ করেছেন, তবে আপনি বলছেন যে আমার অ্যাপটি পপেন () কে কল করছে? আমি আসলে কী তা বুঝতে পারি না।

আমি বলছি একটি এম্বেডড বাইনারি হ'ল অডিও ফাইল বা চিত্রের মতো আপনার বান্ডিলের অন্য একটি রিসোর্স ফাইল, যদিও ফাইলটি পরিবর্তে এক্সিকিউটেবল কমান্ড-লাইন সরঞ্জাম tool popen() ফাংশন (এটি সম্পর্কে আরও পড়তে আপনার টার্মিনাল থেকে man popen ) আপনাকে অন্য চলমান প্রোগ্রাম থেকে স্বেচ্ছাসেবী প্রোগ্রামগুলি চালিত করতে দেয়। system() ফাংশন অন্য উপায়। অন্যরাও রয়েছেন, এবং আমি এখানে একটি historicalতিহাসিক উদাহরণ দেব যা এম্বেডড বাইনারিটির বোঝার ব্যবহারকে আরও কিছুটা পরিষ্কার করতে পারে:

আপনি সম্ভবত সচেতন হিসাবে, আপনি যখন ম্যাক ওএস এক্সে কোনও অ্যাপ্লিকেশন চালু করেন এটি বর্তমান ব্যবহারকারীর আইডি দিয়ে চালু করা হয়। বেশিরভাগ সাধারণ ইনস্টলেশনের অধীনে এটিই ডেস্কটপ admin ব্যবহারকারীর ডিফল্ট ব্যবহারকারী, যাকে ব্যবহারকারী আইডি 501 দেওয়া হয়।

ইউনিক্স-ভিত্তিক অপারেটিং সিস্টেমে কেবলমাত্র root ব্যবহারকারী (ব্যবহারকারী আইডি 0 ) এর পুরো ফাইল সিস্টেমে সম্পূর্ণ অ্যাক্সেস রয়েছে। কখনও কখনও এটি ঘটে যে ডেস্কটপ ব্যবহারকারী দ্বারা চালু করা একটি ইনস্টলার প্রোগ্রামের জন্য কোনও সুবিধাযুক্ত ডিরেক্টরিতে ফাইল ইনস্টল করা প্রয়োজন (উদাহরণস্বরূপ ড্রাইভার)। এই ক্ষেত্রে, অ্যাপ্লিকেশন প্রোগ্রামটির root ব্যবহারকারীর কাছে এটির সুবিধাগুলি বাড়ানো দরকার যাতে এটি এই বিধিনিষেধযুক্ত ডিরেক্টরিতে লিখতে পারে।

ওএস এক্স ১০.7 এর মাধ্যমে অপারেটিং সিস্টেমে এটির সুবিধার্থে অ্যাপল তার অনুমোদন পরিষেবাদি এপিআই -তে প্রামাণিকতা AuthorizationExecuteWithPrivileges() (এটি এখন অবচিত, তবে এটি এখনও একটি দরকারী উদাহরণ)।

AuthorizationExecuteWithPrivileges() একটি আর্গুমেন্ট হিসাবে একটি কমান্ড-লাইন সরঞ্জামকে root হিসাবে root করার পথ হিসাবে নিয়েছিল। কমান্ড লাইন সরঞ্জামটি ছিল একটি এক্সিকিউটেবল শেল স্ক্রিপ্ট বা সংকলিত বাইনারি যা আপনি নিজের ইনস্টল যুক্তি চালানোর জন্য লিখেছিলেন। এই সরঞ্জামটি আপনার অ্যাপ্লিকেশন বান্ডেলের ভিতরে অন্যান্য সংস্থান ফাইলের মতো ইনস্টল করা হয়েছিল।

যখন ডাকা হয়, ওএস ব্যবহারকারীর পাসওয়ার্ড জিজ্ঞাসা করার জন্য একটি অনুমোদনের ডায়ালগ স্থাপন করে (আপনি এটি আগে দেখেছেন!) এবং প্রবেশ করার পরে আপনার অ্যাপ্লিকেশনটির পক্ষ থেকে প্রোগ্রামটিকে root হিসাবে কার্যকর করা হবে। এই প্রক্রিয়াটি কেবল popen() নিজেই একটি প্রোগ্রাম চালানোর অনুরূপ, যদিও popen() আপনাকে সুবিধাগুলি বৃদ্ধির সুবিধা দেয় না।


সংক্ষেপে,

  • সিস্টেম লাইব্রেরি, তাদের লিঙ্ক;
  • তৃতীয় পক্ষের গ্রন্থাগারগুলি এগুলি এম্বেড করুন।

কেন?

  • আপনি যদি সিস্টেম লাইব্রেরিগুলি এম্বেড করার চেষ্টা করেন তবে আপনি সেগুলি পপআপ তালিকায় খুঁজে পাবেন না;
  • যদি আপনি তৃতীয় পক্ষের লাইব্রেরিগুলি লিঙ্ক করেন তবে আপনি সম্ভবত একটি ক্রাশ পাবেন।






embedded-binary