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


140

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

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

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


উত্তর:


239

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


62
এই জিনিসগুলি আপনি কীভাবে জানেন?
ইয়ান ওয়ারবার্টন

56
@ ইয়ানবারবার্টন আমি ২০++ বছর ধরে অ্যাপল অপারেটিং সিস্টেমগুলি প্রোগ্রামিং করে চলেছি এবং এখানে এবং সেখানে কয়েকটি টিডবিট সংগ্রহ করেছি। :)
সমান

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

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

1
হতে পারে নতুন এক্সকোড যাদু রয়েছে যা একটি এম্বেডড ফ্রেমওয়ার্ক লোড করবে। আমার সেই কার্যকারিতাটির দরকার পরে কিছুদিন হয়েছে। আপনি যদি আরও কী চলছে তা অন্বেষণ করতে চান তবে দয়া করে এখানে একটি নতুন প্রশ্ন পোস্ট করুন।
par

35

সংক্ষেপে,

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

কেন?

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

7

এটি Dependencyপরিচালনার একটি অংশ [সম্পর্কে]

দয়া করে মনে রাখবেন যে Xcode 11এতে কেবল রয়েছেFrameworks, Libraries, and Embedded ContentGeneral ট্যাবে বিভাগ

লিঙ্ক বাইনারি

Build Phases -> Link Binary With Librariesএর একটি আয়না General -> Linked Frameworks and Libraries

স্ট্যাটিক লাইব্রেরি এবং ফ্রেমওয়ার্ক

আপনি যদি Static Library or Static Frameworkএই বিভাগে একটি যুক্ত করেন তবে এটি Frameworks গ্রুপ [প্রায়] ( Project Navigator -> <workspace/project> -> Frameworks) এ উপস্থিত হবে এবং এটির জন্য আপনার প্রকল্পে একটি রেফারেন্স যুক্ত হবে। তারপরে এটি ব্যবহার করা হবে Static LinkerStatic Linkerসংকলনের সময় লাইব্রেরি থেকে সমস্ত কোড এক্সিকিউটেবল অবজেক্ট ফাইলে অন্তর্ভুক্ত / অনুলিপি করা হবে। Static linkerএর সাথে জুটি বেঁধে কাজ করেBuild Settings -> <Library/Framework> Search Paths

Static Library

Static Framework

  • Build Settings -> Framework Search Paths। আপনি যদি static frameworkএই বিভাগে একটি যোগ না করেন তবে আপনি একটি সংকলন ত্রুটি পাবেন [এমন কোনও মডিউল নেই]

এম্বেড বাইনারি

স্ট্যাটিক লাইব্রেরি এবং স্ট্যাটিক ফ্রেমওয়ার্ক

এম্বেডিং এর জন্য কোনও অর্থবোধ করতে পারে না Static Libraryএবং Static Frameworkকারণ সেগুলি থেকে প্রাপ্ত চিহ্নগুলি কার্যকরযোগ্য বাইনারিতে সংকলিত হয়েছে। এক্সকোড আপনাকে static libraryএম্বেড বিভাগের আওতায় কোনও ছাড়তে দেবে না ।

গতিশীল ফ্রেমওয়ার্ক

Build Phases -> Embed Frameworksএর একটি আয়না General -> Embedded Binaries। এম্বেডিং আসলে আপনার অ্যাপ্লিকেশন বান্ডেলে ফ্রেমওয়ার্কের একটি অনুলিপি যুক্ত করে। ফলস্বরূপ, যখন কোনও কাঠামো Embedবিভাগে যুক্ত / সরিয়ে ফেলা হবে তখন তা স্বয়ংক্রিয়ভাবে Linkedবিভাগে যুক্ত / সরানো হবে । ডিফল্টরূপে বান্ডেলের ফোল্ডারটি Frameworksতবে আপনি Destinationক্ষেত্রটি ব্যবহার করে এটি পরিবর্তন করতে পারেন । তবুও আপনি একটি নির্দিষ্ট করতে পারেন Subpath

Dynamic linker :dyldলোড অথবা রান টাইম খুঁজে পেতে চেষ্টা করবে এমবেডেড ফ্রেমওয়ার্ক ব্যবহার @rpath[সম্বন্ধে] যদি এটি না পাওয়া যায় ত্রুটি ঘটবে [dyld: গ্রন্থাগার লোড করা]

[লিঙ্ক এবং এম্বেড ব্যবহার করার সময়]

[শব্দভাণ্ডার]

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