ভাগ করা অবজেক্টস (.so), স্ট্যাটিক লাইব্রেরি (.a), এবং ডিএলএল এর (.so) মধ্যে পার্থক্য?


272

আমি লিনাক্সের লাইব্রেরিগুলিতে শ্রদ্ধার সাথে কিছু বিতর্কে জড়িত হয়েছি এবং কিছু বিষয় নিশ্চিত করতে চাই।

এটি আমার বোঝার জন্য (দয়া করে আমি ভুল হলে আমাকে সংশোধন করুন এবং আমি আমার পোস্টটি পরে সম্পাদনা করব), অ্যাপ্লিকেশন তৈরি করার সময় লাইব্রেরি ব্যবহারের দুটি উপায় রয়েছে:

  1. স্ট্যাটিক লাইব্রেরি (.এ ফাইল): লিঙ্কের সময় পুরো লাইব্রেরির একটি অনুলিপি চূড়ান্ত অ্যাপ্লিকেশনে রাখা হয় যাতে লাইব্রেরির মধ্যে থাকা ফাংশনগুলি সর্বদা কলিং অ্যাপ্লিকেশনে উপলব্ধ থাকে
  2. ভাগ করা অবজেক্টস (.so ফাইল): লিঙ্ক সময়ে, অবজেক্টটি কেবলমাত্র তার সম্পর্কিত এপিআই-র বিরুদ্ধে সংশ্লিষ্ট হেডার (.h) ফাইলের মাধ্যমে যাচাই করা হয়। লাইব্রেরিটি আসলে রানটাইম হওয়া পর্যন্ত ব্যবহার করা হয় না, যেখানে এটি প্রয়োজন।

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

আমি শুনেছি কিছু লোক ভাগ করা বস্তু এবং গতিশীল লিঙ্কযুক্ত লাইব্রেরি (ডিএলএল) এর মধ্যে পার্থক্য তৈরি করেছে, যদিও তারা উভয় ".so" ফাইল রয়েছে are লিনাক্স বা অন্য কোনও পসিক্স কমপ্লায়েন্ট ওএসে (যেমন: মিনিক্স, ইউনিক্স, কিউএনএক্স, ইত্যাদি) সি / সি ++ বিকাশের ক্ষেত্রে ভাগ করা অবজেক্ট এবং ডিএলএলগুলির মধ্যে কোনও পার্থক্য আছে কি? আমাকে বলা হয়েছে যে একটি মূল পার্থক্য (এখনও অবধি) ভাগ করা অবজেক্টগুলি রানটাইমের সময় সবেমাত্র ব্যবহৃত হয়, যখন ডিএলএল অবশ্যই অ্যাপ্লিকেশনের মধ্যে ড্লোপেন () কল ব্যবহার করে প্রথমে খুলতে হবে।

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

আপনার সহায়তার জন্য সকলকে আগাম ধন্যবাদ

হালনাগাদ


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

  1. ভাগ করা অবজেক্ট: একটি লাইব্রেরি যা প্রোগ্রামটি শুরু হওয়ার পরে স্বয়ংক্রিয়ভাবে কোনও প্রোগ্রামের সাথে সংযুক্ত হয়ে যায় এবং স্ট্যান্ড্যালোন ফাইল হিসাবে উপস্থিত থাকে। সংকলনের সময় লাইব্রেরিটি লিঙ্কিং তালিকায় অন্তর্ভুক্ত করা হয়েছে (যেমন: LDOPTS+=-lmylibনামকরণের একটি লাইব্রেরী ফাইলের জন্য mylib.so)। সংকলনের সময় লাইব্রেরিটি উপস্থিত থাকতে হবে এবং কখন অ্যাপ্লিকেশন শুরু হবে।
  2. স্ট্যাটিক লাইব্রেরি: একটি লাইব্রেরি যা অ্যাপ্লিকেশন কোড এবং লাইব্রেরি কোড সহ একটি একক (বৃহত্তর) অ্যাপ্লিকেশনটির জন্য নির্মাণের সময় প্রকৃত প্রোগ্রামে নিজেই একত্রীকরণ করা হয় যা প্রোগ্রামটি তৈরি হওয়ার পরে স্বয়ংক্রিয়ভাবে কোনও প্রোগ্রামের সাথে যুক্ত হয় এবং ফাইনাল বাইনারি উভয়ই থাকে মূল প্রোগ্রাম এবং লাইব্রেরি নিজেই একটি একক স্ট্যান্ডেলোন বাইনারি ফাইল হিসাবে উপস্থিত রয়েছে। সংকলনের সময় লাইব্রেরিটি লিঙ্কিং তালিকায় অন্তর্ভুক্ত করা হয়েছে (অর্থাত: LDOPTS+=-lmylibmylib.a নামের লাইব্রেরি ফাইলের জন্য)। সংকলনের সময় গ্রন্থাগারটি উপস্থিত থাকতে হবে।
  3. ডিএলএল: মূলত একটি ভাগ করা অবজেক্টের সমান, তবে সংকলনের সময় লিঙ্কিং তালিকায় অন্তর্ভুক্ত না করে, পাঠাগারটি dlopen()/ dlsym()কমান্ডের মাধ্যমে লোড করা হয় যাতে প্রোগ্রামটি সংকলনের জন্য লাইব্রেরিটি নির্মাণের সময় উপস্থিত হওয়ার প্রয়োজন না হয়। এছাড়াও, গ্রন্থাগার আবেদন সূচনার বা কম্পাইল সময় উপস্থিত (অগত্যা) হতে দরকার নেই যেমন শুধুমাত্র মুহূর্তে প্রয়োজন, dlopen/ dlsymকল তৈরি করা হয়।
  4. ভাগ করা সংরক্ষণাগার: মূলত স্ট্যাটিক লাইব্রেরির সমান, তবে "এক্সপোর্ট-শেয়ার্ড" এবং "-fPIC" পতাকা সহ সংকলিত। সংকলনের সময় লাইব্রেরিটি লিঙ্কিং তালিকায় অন্তর্ভুক্ত করা হয়েছে (যেমন: LDOPTS+=-lmylibSনামকরণের একটি লাইব্রেরী ফাইলের জন্য mylibS.a)। উভয়ের মধ্যে পার্থক্যটি হ'ল এই অতিরিক্ত পতাকাটি প্রয়োজনীয় যদি কোনও ভাগ করা অবজেক্ট বা ডিএলএল ভাগযুক্ত সংরক্ষণাগারটিকে তার নিজস্ব কোডের সাথে স্থিতিশীলভাবে লিঙ্ক করতে চায় এবং ভাগ করা অবজেক্টের ফাংশনগুলি কেবলমাত্র তাদের ব্যবহারের পরিবর্তে উপলব্ধ করতে সক্ষম করে অভ্যন্তরীণ ডিএলএল। এই ক্ষেত্রে দরকারী যখন কেউ আপনাকে একটি স্ট্যাটিক লাইব্রেরি সরবরাহ করে এবং আপনি এটি একটি এসও হিসাবে পুনঃস্থাপন করতে চান। সংকলনের সময় গ্রন্থাগারটি উপস্থিত থাকতে হবে।

অতিরিক্ত আপডেট

" DLL" এবং " shared library" এর মধ্যে পার্থক্যটি ছিল সেই সময়ে আমি যে সংস্থায় কাজ করেছি (উইন্ডোজ বিকাশকারীরা লিনাক্স বিকাশে সরিয়ে নিতে বাধ্য হয়েছিল, এবং শব্দটি আটকে আছে), উপরে উল্লিখিত বর্ণনাকে মেনে চলা মাত্র একটি (অলস, ভুল) বক্তৃতা।

অতিরিক্ত হিসাবে, " S" ভাগ করা আর্কাইভস "এর ক্ষেত্রে লাইব্রেরির নামের পরে আক্ষরিক " " পিছনে পিছনে ছিল কেবলমাত্র সেই সংস্থায় ব্যবহৃত একটি কনভেনশন, সাধারণভাবে শিল্পে নয়।


14
জন্য .aফাইল, "A" আসলে "archove" ঘোরা, এবং এটি কেবল অবজেক্ট ফাইলগুলি একটি সংরক্ষণাগার আছে। আধুনিক লঙ্কারগুলিকে সময়কালীন গ্রন্থাগারটি অন্তর্ভুক্ত না করার জন্য যথেষ্ট ভাল হওয়া উচিত, সংরক্ষণাগারে থাকা কেবলমাত্র বস্তুর ফাইলগুলি, এবং এমনকি রেফারেন্সযুক্ত অবজেক্ট ফাইলে কোড / ডেটা বিভাগগুলি ব্যবহার করতে পারে।
কিছু প্রোগ্রামার ড্যুড

4
ডিএলএল কেবল উইন্ডোজ পরিভাষা। এটি এককগুলিতে ব্যবহৃত হয় না।
আর .. গীটহাব বন্ধ হেল্পিং আইসিসি



2
@ ডেভনুল অবশ্যই "আর্চ আই ভেই" । :)
কিছু প্রোগ্রামার

উত্তর:


93

আমি সবসময়ই ভেবে দেখেছি যে ডিএলএল এবং ভাগ করা বস্তুগুলি একই জিনিসটির জন্য কেবল আলাদা পদ - উইন্ডোজ তাদের ডিএলএল বলে, যখন ইউনিক্স সিস্টেমে তারা সাধারণ শব্দ সহ - গতিযুক্তভাবে সংযুক্ত গ্রন্থাগার - উভয়কে আবরণ করে (এমনকি এটির ক্রিয়াকলাপও ইউএনআইএক্স-এ একটি .so খুলুনকে dlopen()'ডায়নামিক লাইব্রেরি'র পরে ডাকা হয়)।

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

স্ট্যাটিক লাইব্রেরিগুলি কেবল আপনার প্রকল্পের সংকলনের অংশ হিসাবে নিজেকে গড়ে তুলছেন ঠিক যেমন সংকলকটির বাইরে কেবল অবজেক্ট ফাইলগুলির বান্ডিলগুলি রয়েছে, তাই তারা ঠিক একইভাবে লিংকটিকে টানতে এবং খাওয়ানো হয় এবং অব্যবহৃত বিটগুলি হয় ঠিক একই ভাবে বাদ পড়েছে।


1
আমি কেন লিনাক্সে কিছু প্রকল্প দেখতে পাচ্ছি যে ".so" ফাইলের মধ্যে ফাংশনগুলি অ্যাক্সেস করার জন্য ড্লোপেন () কলটি ব্যবহার করতে হবে এবং কিছু কিছু করার দরকার নেই? ধন্যবাদ, যাইহোক!
মেঘ

9
প্রসেস লোডার, লিনাক্স এর এলফ লোডার দ্বারা তাদের হাতে ফাংশনগুলি হস্তান্তর করে না এমনগুলি। অ্যাপ্লিকেশনটি একটি .so বা .dll খুলতে ও এটি ব্যবহার করতে চায় না এমন সংকলন করতে বা প্লাগইনগুলির মতো অতিরিক্ত কার্যকারিতা যুক্ত করতে চাইলে ড্লোপেন বিদ্যমান।
রাপাদুরা

কিন্তু .so যদি নির্ধারিত সময়ে উপস্থিত না থাকে তবে অ্যাপ্লিকেশনটি মোটেই সংকলন করবে না? লিঙ্কারকে চূড়ান্ত প্রোগ্রামটি তৈরি করতে বাধ্য করা কি সম্ভব .so উপস্থিত না থাকলে? ধন্যবাদ.
মেঘ

1
আমি বিশ্বাস করি যে এটি আপনি কীভাবে .so থেকে ফাংশনগুলি ব্যবহার করেন তার উপর নির্ভর করে তবে এখানে এই থামার বিষয়ে আমার জ্ঞান: / ভাল প্রশ্ন।
রাপাদুরা

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

197

একটি স্ট্যাটিক লাইব্রেরি (.a) এমন একটি গ্রন্থাগার যা লিঙ্কার দ্বারা উত্পাদিত চূড়ান্ত নির্বাহযোগ্যের সাথে সরাসরি যুক্ত করা যেতে পারে, এটি এতে অন্তর্ভুক্ত থাকে এবং যেখানে এক্সিকিউটেবল মোতায়েন করা হবে সেই ব্যবস্থাটিতে লাইব্রেরি রাখার দরকার নেই।

একটি শেয়ার্ড লাইব্রেরি (.so) একটি লাইব্রেরি যা লিংকযুক্ত তবে চূড়ান্ত নির্বাহযোগ্যতে এমবেড করা হয় না, তাই এক্সিকিউটেবল চালু হওয়ার সময় লোড করা হবে এবং যেখানে এক্সিকিউটেবল স্থাপন করা হয় সেই সিস্টেমে উপস্থিত থাকা প্রয়োজন।

উইন্ডোজের একটি ডায়নামিক লিঙ্ক লাইব্রেরি (.dll) লিনাক্সের একটি ভাগ করা লাইব্রেরি (.so) এর মতো তবে ওএস (উইন্ডোজ বনাম লিনাক্স) সম্পর্কিত দুটি বাস্তবায়নের মধ্যে কিছু পার্থক্য রয়েছে:

একটি ডিএলএল দুই ধরণের ফাংশন সংজ্ঞায়িত করতে পারে: রফতানি এবং অভ্যন্তরীণ। রফতানি করা ক্রিয়াকলাপগুলি অন্যান্য মডিউলগুলি কল করার পাশাপাশি ডিএলএল থেকে যেখানে সেগুলি সংজ্ঞায়িত করা হবে তা কল্পনা করা হয়। অভ্যন্তরীণ ফাংশনগুলি সাধারণত ডিএলএল থেকে যেখানে সংজ্ঞায়িত হয় কেবল সেখান থেকেই ডাকা হয়।

লিনাক্সের একটি এসও গ্রন্থাগারের রফতানযোগ্য প্রতীকগুলি চিহ্নিত করার জন্য বিশেষ রফতানি বিবরণের প্রয়োজন নেই, কারণ সমস্ত চিহ্নগুলি একটি জিজ্ঞাসাবাদের প্রক্রিয়াতে উপলব্ধ।


1
+1 দুর্দান্ত সরল ব্যাখ্যা। একটি ফাংশন একটি ডিএলএল মধ্যে "অভ্যন্তরীণ" ঘোষিত হয় তাহলে এর মানে কি এটা করতে পারবেন না গ্রন্থাগার বাইরে থেকে বলা যেতে?
মাইকে

23
এটি অগত্যা সত্য নয় যে সমস্ত চিহ্ন একটি এসও গ্রন্থাগারে পাওয়া যায়। লুকানো প্রতীকগুলি সম্ভব এবং প্রস্তাবিত কারণ গ্রন্থাগার ব্যবহারকারীদের জন্য আপনার সমস্ত চিহ্নগুলি দেখার কোনও ভাল কারণ নেই।
জ্যান লিংস

3
এফওয়াইআই: জি ++ এর __attribute__নির্বাচিতভাবে 'এক্সপোর্ট' প্রতীকগুলির জন্য বাক্য গঠন রয়েছে :#define DLLEXPORT __attribute__ ((visibility("default"))) #define DLLLOCAL __attribute__ ((visibility("hidden")))
ব্রায়ান হক

33

উইন্ডোজের ডিএলএলগুলির বিবরণগুলি এখানে আমার বন্ধুদের কাছে * এনআইএক্স-ল্যান্ডে স্পষ্ট করতে সহায়তা করতে আমি বিস্তারিত বলতে পারি ...

একটি ডিএলএল ভাগ করা অবজেক্ট ফাইলের মতো। উভয়ই চিত্রগুলি, সম্পর্কিত ওএসের প্রোগ্রাম লোডার দ্বারা মেমরিতে লোড করার জন্য প্রস্তুত। লিঙ্কার এবং লোডারগুলিকে প্রয়োজনীয় সমিতি তৈরি করতে এবং কোডের লাইব্রেরিটি ব্যবহার করতে সহায়তা করার জন্য ছবিগুলির সাথে মেটাডেটার বিভিন্ন বিট রয়েছে।

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

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

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

ডিএলএলগুলির একটি আকর্ষণীয় বৈশিষ্ট্য হ'ল তারা হ্যান্ডলারের ক্রিয়াকলাপটিকে "ওভার লোড / আনলোড" ঘোষণা করতে পারে। যখনই ডিএলএল লোড বা আনলোড করা হয়, ডিএলএল কিছু সূচনা বা ক্লিনআপ সম্পাদন করতে পারে, যেমনটি হতে পারে। কোনও ডিভাইস ড্রাইভার বা ভাগ করা অবজেক্ট ইন্টারফেসের মতো কোনও অবজেক্ট-ওরিয়েন্টেড রিসোর্স ম্যানেজার হিসাবে কোনও ডিএলএল রাখার জন্য এই মানচিত্রটি দুর্দান্তভাবে ম্যাপ করে।

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

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


4

আপনি ঠিক আছেন যে স্থির ফাইলগুলি লিংক-সময়ে অ্যাপ্লিকেশনটিতে অনুলিপি করা হয়, এবং সেই ভাগ করা ফাইলগুলি কেবলমাত্র লিঙ্কের সময় যাচাই করা হয় এবং রানটাইমে লোড হয়।

ড্লোপেন কলটি কেবল ভাগ করা অবজেক্টের জন্য নয়, যদি অ্যাপ্লিকেশনটি তার পক্ষ থেকে রানটাইম সময়ে এটি করতে চায়, অন্যথায় অ্যাপ্লিকেশন শুরু হওয়ার সাথে ভাগ করা বস্তুগুলি স্বয়ংক্রিয়ভাবে লোড হয়। DLLS এবং .so একই জিনিস। প্রক্রিয়াগুলির জন্য আরও বেশি সূক্ষ্ম-গঞ্জযুক্ত গতিশীল লোডিং ক্ষমতা যুক্ত করতে ড্লোপেন বিদ্যমান। ডিএলএলগুলি খুলতে / ব্যবহার করতে আপনাকে নিজেকে ড্লোপেন ব্যবহার করতে হবে না, এটি অ্যাপ্লিকেশন শুরুতেও ঘটে at


আরও লোডিং নিয়ন্ত্রণের জন্য ড্লোপেন () ব্যবহারের একটি উদাহরণ কী হবে? যদি শুরুতে এসও / ডিএলএল স্বয়ংক্রিয়ভাবে লোড হয়, তবে কী ড্লোপেন () এটি পৃথক অনুমতি বা বিধিনিষেধ সহ বন্ধ করে পুনরায় খুলবে, উদাহরণস্বরূপ? ধন্যবাদ.
মেঘ

1
আমি বিশ্বাস করি যে ড্লোপেন প্লাগইন বা অনুরূপ কার্যকারিতার জন্য। অনুমতিগুলি / বিধিনিষেধগুলি স্বয়ংক্রিয় লোডিংয়ের মতোই হওয়া উচিত এবং যাইহোক কোনও ড্লোপেন পুনরাবৃত্তভাবে নির্ভরযোগ্য লাইব্রেরিগুলি লোড করবে।
রাপাদুরা

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