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