গতিশীল বনাম স্থির লাইব্রেরি কখন ব্যবহার করবেন


437

সি ++ এ শ্রেণিবদ্ধ গ্রন্থাগার তৈরি করার সময় আপনি গতিশীল ( .dll, .so) এবং স্ট্যাটিক ( .lib, .a) লাইব্রেরির মধ্যে বেছে নিতে পারেন। তাদের মধ্যে পার্থক্য কী এবং কখন ব্যবহার করা উপযুক্ত?


2
এটি লক্ষ করা উচিত যে এখানে আরও কিছু রয়েছে যা "আমদানি গ্রন্থাগার" চেক স্ট্যাকওভারফ্লো.com
জিজ্ঞাসা /

উত্তর:


299

স্ট্যাটিক লাইব্রেরি আপনার বাইনারি কোডের আকার বাড়ায়। এগুলি সর্বদা লোড হয় এবং আপনি যে কোডটি সংকলিত করেছেন তার সংস্করণ হ'ল কোডটির সংস্করণ version

ডায়নামিক লাইব্রেরিগুলি পৃথকভাবে সঞ্চয় এবং সংস্করণ করা হয়। ডায়নামিক লাইব্রেরির এমন কোনও ভার্সনটি লোড করা সম্ভব যা আপডেটটি মূল সংস্করণের সাথে বাইনারি সামঞ্জস্যপূর্ণ বলে বিবেচিত হলে আপনার কোডটি প্রেরণ করা মূলটি নয় was

অতিরিক্তভাবে ডায়নামিক লাইব্রেরিগুলি প্রয়োজনীয়ভাবে লোড করা হয় না - এগুলি সাধারণত প্রথম বলা হলে লোড করা হয় - এবং একই লাইব্রেরি ব্যবহার করে এমন উপাদানগুলির মধ্যে ভাগ করা যায় (একাধিক ডেটা লোড, একটি কোড লোড)।

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


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

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

6
@ জিফ্রে: রিলোক্যাটেবল = বিভিন্ন ভার্চুয়াল ঠিকানায় লোড করা যায়। ডিএলএল অবশ্যই এটি সমর্থন করে।
dma_k

20
@ ডিএমএ_কে: উইন্ডোজ ডিএলএল বিভিন্ন ঠিকানায় লোড করা যায়, তবে কেবলমাত্র লিঙ্কারটি সমস্ত কোড অনুলিপি করে এবং ঠিকানা নম্বর পরিবর্তন করে। ভাগ করা বস্তুর সাথে, সমস্ত ঠিকানা উল্লেখগুলি আপেক্ষিক, তাই একাধিক প্রক্রিয়া ভাগ করা অবজেক্টের জন্য একই মেমরিটি ভাগ করতে পারে। অন্য কথায়, উইন্ডোজে, 3 টি প্রোগ্রাম = 3 এমবি দ্বারা ব্যবহৃত একটি 1 এমবি ডিএলএল। লিনাক্সে, 3 টি প্রোগ্রাম = 1 এমবি দ্বারা ব্যবহৃত একটি এমবি এসও।
জিফ্রে

7
উইন্ডোজ এবং লিনাক্স উভয়েরই ভাগ করা লাইব্রেরিগুলি লোড-টাইম স্থানান্তরকরণের ধারণা রয়েছে eli.thegreenplace.net/2011/08/25/… পজিশন ইন্ডিপেন্ডেন্ট কোডকে যে সবচেয়ে বড় জিনিস মঞ্জুরি দিয়েছিল তা লিনাক্সের পক্ষে বিশেষ কিছু ছিল না, বরং আরআইপি-আপেক্ষিক সম্বোধন যুক্ত করা হয়েছিল x64 নির্দেশ সেট সহ; উইন্ডোজ এবং লিনাক্স উভয়ই লাইব্রেরি স্থানান্তরিত করার সময় ফিক্সআপের সংখ্যা হ্রাস করতে আরআইপি সম্পর্কিত আপেক্ষিক ঠিকানা ব্যবহার করতে পারে।
ক্ল্যামিইউ

194

স্ট্যাটিক লাইব্রেরি কী তা অন্যরা পর্যাপ্তরূপে ব্যাখ্যা করেছেন, তবে আমি কমপক্ষে উইন্ডোজে স্ট্যাটিক লাইব্রেরি ব্যবহারের কিছু সতর্কতা উল্লেখ করতে চাই:

  • সিলেটলেটস: যদি কোনও বিশ্বব্যাপী / স্ট্যাটিক এবং অনন্য হতে হয় তবে এটি একটি স্ট্যাটিক লাইব্রেরিতে রাখার বিষয়ে খুব সাবধানতা অবলম্বন করুন। যদি স্থির লাইব্রেরির সাথে একাধিক ডিএলএল সংযুক্ত থাকে তবে তারা প্রত্যেকে সিঙ্গলটনের নিজস্ব অনুলিপি পাবে। তবে, যদি আপনার অ্যাপ্লিকেশনটি কোনও কাস্টম ডিএলএলবিহীন একক EXE হয়, তবে এটি সমস্যা নাও হতে পারে।

  • অযৌক্তিক কোড অপসারণ: আপনি যখন কোনও স্ট্যাটিক লাইব্রেরির সাথে লিঙ্ক করেন, কেবল তখনই আপনার স্ট্রাইক লাইব্রেরির অংশগুলি আপনার ডিএলএল / এএসইই দ্বারা উল্লিখিত হয় তবে আপনার ডিএলএল / এক্সের সাথে সংযুক্ত হয়ে যাবে।

    উদাহরণস্বরূপ, যদি mylib.libথাকে a.objএবং b.objএবং আপনার ডিএলএল / EXE এর শুধুমাত্র রেফারেন্স ফাংশন বা থেকে ভেরিয়েবল a.obj, এর সম্পূর্ণতা b.objlinker দ্বারা বাতিল করা হবে। যদি b.objগ্লোবাল / স্ট্যাটিক অবজেক্ট থাকে তবে তাদের কনস্ট্রাক্টর এবং ডেস্ট্রাক্টরগুলি কার্যকর করা হবে না। যদি সেই নির্মাণকারী / ধ্বংসকারীদের পার্শ্ব প্রতিক্রিয়া থাকে তবে আপনি তাদের অনুপস্থিতিতে হতাশ হতে পারেন।

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

    এর আর একটি পরিণতি হ'ল স্থির লাইব্রেরিতে এমন অবজেক্ট ফাইল থাকতে পারে যা অমীমাংসিত রেফারেন্সের কারণে পুরোপুরি অব্যবহারযোগ্য, তবে আপনি যদি সেই সমস্ত অবজেক্ট ফাইল থেকে কোনও ফাংশন বা পরিবর্তনশীল উল্লেখ না করেন তবে এটি কোনও লিঙ্কারের ত্রুটির কারণ হবে না। এটি গ্রন্থাগারটি লেখার অনেক পরে হতে পারে।

  • ডিবাগ প্রতীক: আপনি প্রতিটি স্ট্যাটিক লাইব্রেরির জন্য পৃথক পিডিবি চাইবেন, বা আপনি ডিবাগ প্রতীকগুলি বস্তু ফাইলগুলিতে স্থাপন করতে চান যাতে তারা ডিএলএল / এএসইই জন্য পিডিবিতে রোলড হয়। ভিজ্যুয়াল সি ++ ডকুমেন্টেশন প্রয়োজনীয় বিকল্পগুলি ব্যাখ্যা করে

  • আরটিটিআই: আপনি type_infoযদি একক স্ট্যাটিক লাইব্রেরিকে একাধিক ডিএলএলে লিঙ্ক করেন তবে আপনি একই বর্গের একাধিক অবজেক্টের সাথে শেষ করতে পারেন। যদি আপনার প্রোগ্রামটি ধরে নেয় যে type_infoএটি "সিঙ্গেলটন" ডেটা এবং ব্যবহারগুলি &typeid()বা type_info::before(), আপনি অনাকাঙ্ক্ষিত এবং আশ্চর্যজনক ফলাফল পেতে পারেন।


23
সিঙ্গেলনের বিষয়ে কথাটি ভুলে যাবেন না যে কোনও ডিএলএল একাধিকবার (একই সংস্করণ বা বহুবিধ সংস্করণ) লোড হতে পারে এবং এখনও কোনও সিঙ্গলটনের গ্যারান্টি নেই।
ওরিওন অ্যাড্রিয়ান

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

@ bk1e এটি হওয়া উচিত নয়। .a এ সবসময় এটি ব্যবহার করা সমস্ত চিহ্ন থাকবে will এটি যখন আপনার অ্যাপ্লিকেশনের সাথে স্থিতিশীলভাবে সংযুক্ত হবে, হ্যাঁ কেবলমাত্র ব্যবহৃত চিহ্নগুলিই এতে যুক্ত হবে
মাইলস রাউট

62

একটি লিবিব কোডের একটি ইউনিট যা আপনার প্রয়োগের মধ্যে কার্যকর হয়।

একটি dll এক্সিকিউটেবল কোডের একক ইউনিট। কোডটিতে কল করা হলেই এটি প্রক্রিয়াতে লোড হয়। একটি ডিএল একাধিক অ্যাপ্লিকেশন দ্বারা ব্যবহার করা যেতে পারে এবং একাধিক প্রসেসে লোড করা যায়, যখন এখনও হার্ড ড্রাইভে কোডের কেবল একটি অনুলিপি থাকে।

ডেল পেশাদার : বিভিন্ন পণ্যের মধ্যে কোড পুনরায় ব্যবহার / ভাগ করতে ব্যবহার করা যেতে পারে; চাহিদা অনুযায়ী প্রক্রিয়া মেমরি লোড এবং প্রয়োজন হবে না যখন আনলোড করা যেতে পারে; প্রোগ্রামের বাকি অংশগুলির থেকে স্বাধীনভাবে আপগ্রেড করা যায়।

Dll কনস : dll লোডিং এবং কোড রিবেসিং এর কর্মক্ষমতা প্রভাব; সংস্করণ সমস্যা ("ডেল হেল")

লিব পেশাদাররা : কোডটি প্রক্রিয়াটিতে সর্বদা লোড থাকে এবং পুনরায় সেট করা হয় না বলে কোনও কার্যকারিতা প্রভাবিত করে না; সংস্করণ সমস্যা নেই

লিব কনস : এক্সিকিউটেবল / প্রসেস "ফোলা" - সমস্ত কোড আপনার এক্সিকিউটেবলে থাকে এবং প্রক্রিয়া শুরু হওয়ার পরে লোড হয়; কোনও পুনঃব্যবহার / ভাগ করে নেওয়ার নয় - প্রতিটি পণ্যটির কোডের নিজস্ব কপি থাকে।


রিবেসিং রিবেস.এক্সই ব্যবহার করে বিল্ড টাইম বা লিংক.এক্সে / বেস বেস বিকল্পটি পাস করেও করা যেতে পারে। এটি কার্যকর কিনা তা রানটাইমের সময় কোনও অপ্রত্যাশিত ঠিকানা স্পেস দ্বন্দ্ব রয়েছে কিনা তার উপর নির্ভর করে।
বিকে 1 ই

24

স্ট্যাটিক বনাম গতিশীল লাইব্রেরিগুলির প্রযুক্তিগত বিপর্যয় ছাড়াও (স্ট্যাটিক ফাইলগুলি এক বিশাল বাইনারি বনাম ডায়নামিক লাইব্রেরিগুলিতে সমস্ত কিছু বান্ডিল করে যা বেশ কয়েকটি বিভিন্ন এক্সিকিউটেবলের মধ্যে কোড ভাগ করে নেওয়ার অনুমতি দেয়) এর আইনী জটিলতাও রয়েছে

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

আপনি যদি মোবাইল অ্যাপ্লিকেশনগুলি সংকলন করতে চান তবে উদাহরণস্বরূপ (অ্যান্ড্রয়েডে আপনার কাছে স্ট্যাটিক বনাম ডায়নামিকের একটি পছন্দ রয়েছে, আইওএসে আপনি যা করেন না - এটি সর্বদা স্থির থাকে) এটি আরও বেশি গুরুত্বপূর্ণ সমস্যা হয়ে ওঠে।


23

সি ++ প্রোগ্রাম দুটি ধাপে নির্মিত

  1. সংকলন - অবজেক্ট কোড উত্পন্ন করে (.obj)
  2. লিঙ্কিং - এক্সিকিউটেবল কোড (.exe বা .dll) উত্পাদন করে

স্ট্যাটিক লাইব্রেরি (.lib) হ'ল .obj ফাইলগুলির একটি বান্ডিল এবং এটি একটি সম্পূর্ণ প্রোগ্রাম নয়। এটি কোনও প্রোগ্রাম তৈরির দ্বিতীয় (লিঙ্কিং) পর্যায়ে যায় নি। অন্যদিকে, ডেলগুলি এক্সের মতো এবং তাই সম্পূর্ণ প্রোগ্রাম।

আপনি যদি একটি স্ট্যাটিক লাইব্রেরি তৈরি করেন তবে এটি এখনও লিঙ্কযুক্ত নয় এবং তাই আপনার স্থির গ্রন্থাগারের গ্রাহকদের আপনার ব্যবহৃত একই সংকলকটি ব্যবহার করতে হবে (আপনি যদি জি ++ ব্যবহার করেন তবে তাদের জি ++ ব্যবহার করতে হবে)।

পরিবর্তে আপনি যদি একটি ডেল তৈরি করেন (এবং এটি সঠিকভাবে তৈরি করেছেন ) তবে আপনি একটি সম্পূর্ণ প্রোগ্রাম তৈরি করেছেন যা সমস্ত গ্রাহকরা ব্যবহার করতে পারেন, তারা কোন সংকলক ব্যবহার করছেন তা বিবেচনা করেই নয়। ক্রস সংকলক সামঞ্জস্যতা পছন্দসই হলে, একটি ডেল থেকে রফতানি করার ক্ষেত্রে বেশ কয়েকটি বিধিনিষেধ রয়েছে।


1
আমার জন্য এটাই সংবাদ. ডিএলএল ব্যবহার করার সময় ক্রস সংকলকগুলির সাথে কোন বিধিনিষেধ রয়েছে? একই সরঞ্জামচেনের প্রয়োজন ছাড়াই প্রোগ্রামার তৈরি করা ডিএলএলগুলির জন্য বিশাল প্লাসের মতো মনে হয়
ড্যান

1
এই উত্তরটি তথ্যবহুল। ছোটখাট সতর্কীকরণ যোগ করার পদ্ধতি: consumers of your static library will have to use the same compiler that you usedস্ট্যাটিক গ্রন্থাগার যেমন সি ++ লাইব্রেরি ব্যবহার করে #include <iostream>
ট্রুথহোল্ডার

একই সংকলকটি ব্যবহার না করা হলে একটি সি ++ ডিএল গ্রহণ করতে পারে না (কারণ সেখানে স্ট্যান্ডার্ড সি ++ অবি নেই, চিহ্নগুলি বিভিন্ন উপায়ে ম্যাঙ্গেল করা হয়)।
Dll

19

একটি স্ট্যাটিক লাইব্রেরি তৈরি করা হচ্ছে

$$:~/static [32]> cat foo.c
#include<stdio.h>
void foo()
{
printf("\nhello world\n");
}
$$:~/static [33]> cat foo.h
#ifndef _H_FOO_H
#define _H_FOO_H

void foo();

#endif
$$:~/static [34]> cat foo2.c
#include<stdio.h>
void foo2()
{
printf("\nworld\n");
}
$$:~/static [35]> cat foo2.h
#ifndef _H_FOO2_H
#define _H_FOO2_H

void foo2();

#endif
$$:~/static [36]> cat hello.c
#include<foo.h>
#include<foo2.h>
void main()
{
foo();
foo2();
}
$$:~/static [37]> cat makefile
hello: hello.o libtest.a
        cc -o hello hello.o -L. -ltest
hello.o: hello.c
        cc -c hello.c -I`pwd`
libtest.a:foo.o foo2.o
        ar cr libtest.a foo.o foo2.o
foo.o:foo.c
        cc -c foo.c
foo2.o:foo.c
        cc -c foo2.c
clean:
        rm -f foo.o foo2.o libtest.a hello.o

$$:~/static [38]>

একটি গতিশীল গ্রন্থাগার তৈরি

$$:~/dynamic [44]> cat foo.c
#include<stdio.h>
void foo()
{
printf("\nhello world\n");
}
$$:~/dynamic [45]> cat foo.h
#ifndef _H_FOO_H
#define _H_FOO_H

void foo();

#endif
$$:~/dynamic [46]> cat foo2.c
#include<stdio.h>
void foo2()
{
printf("\nworld\n");
}
$$:~/dynamic [47]> cat foo2.h
#ifndef _H_FOO2_H
#define _H_FOO2_H

void foo2();

#endif
$$:~/dynamic [48]> cat hello.c
#include<foo.h>
#include<foo2.h>
void main()
{
foo();
foo2();
}
$$:~/dynamic [49]> cat makefile
hello:hello.o libtest.sl
        cc -o hello hello.o -L`pwd` -ltest
hello.o:
        cc -c -b hello.c -I`pwd`
libtest.sl:foo.o foo2.o
        cc -G -b -o libtest.sl foo.o foo2.o
foo.o:foo.c
        cc -c -b foo.c
foo2.o:foo.c
        cc -c -b foo2.c
clean:
        rm -f libtest.sl foo.o foo

2.o hello.o
$$:~/dynamic [50]>

13

একটি স্ট্যাটিক লাইব্রেরি ক্লায়েন্টে সংকলিত হয়। একটি .lib সংকলন সময়ে ব্যবহার করা হয় এবং গ্রন্থাগারের বিষয়বস্তু গ্রাহক এক্সিকিউটেবল অংশ হয়ে।

একটি ডায়নামিক লাইব্রেরি রানটাইমে লোড হয় এবং ক্লায়েন্টের এক্সিকিউটেবলের মধ্যে সংকলিত হয় না। ডায়নামিক লাইব্রেরিগুলি আরও নমনীয় কারণ একাধিক ক্লায়েন্ট এক্সিকিউটেবলগুলি একটি ডিএলএল লোড করতে পারে এবং এর কার্যকারিতাটি ব্যবহার করতে পারে। এটি আপনার ক্লায়েন্ট কোডের সামগ্রিক আকার এবং রক্ষণাবেক্ষণকে সর্বনিম্ন রাখে।


13

সময়ের সাথে সাথে সংস্করণ, স্থিতিশীলতা, সামঞ্জস্যতা ইত্যাদির বিষয়ে আপনার সাবধানে চিন্তা করা উচিত

যদি দুটি অ্যাপ্লিকেশন রয়েছে যা ভাগ করে দেওয়া কোড ব্যবহার করে, আপনি কি সেই অ্যাপ্লিকেশনগুলিকে একে অপরের সাথে সামঞ্জস্যপূর্ণ হওয়ার প্রয়োজনে একসাথে পরিবর্তন করতে বাধ্য করতে চান? তারপরে dll ব্যবহার করুন। সমস্ত EXE একই কোড ব্যবহার করবে।

অথবা আপনি কি একে অপরের থেকে বিচ্ছিন্ন করতে চান, যাতে আপনি একজনকে পরিবর্তন করতে পারেন এবং আত্মবিশ্বাসী হতে পারেন যে আপনি অন্যটিকে ভাঙ্গেননি। তারপরে স্ট্যাটিক লিব ব্যবহার করুন।

ডিএলএল জাহান্নাম হ'ল যখন আপনি সম্ভবত একটি স্ট্যাটিক লিব ব্যবহার করা উচিত, তবে আপনি তার পরিবর্তে একটি ডেল ব্যবহার করেছিলেন, এবং সমস্ত এক্সেসগুলি এর সাথে সমবেত হয় না।


9

একটি স্ট্যাটিক লাইব্রেরি অবশ্যই চূড়ান্ত নির্বাহের সাথে সংযুক্ত করা উচিত; এটি এক্সিকিউটেবলের অংশ হয়ে যায় এবং যেখানেই যায় সেখানে অনুসরণ করে। একটি ডায়নামিক লাইব্রেরি প্রতিটি সময় এক্সিকিউটেবল কার্যকর করার সময় লোড হয় এবং ডিএলএল ফাইল হিসাবে এক্সিকিউটেবল থেকে পৃথক থাকে।

আপনি যখন একটি এক্সিকিউটেবলকে পুনরায় লিঙ্ক না করে লাইব্রেরির প্রদত্ত কার্যকারিতাটি পরিবর্তন করতে সক্ষম হতে চান তখন আপনি একটি ডিএলএল ব্যবহার করবেন (এক্সিকিউটেবল ফাইলটি প্রতিস্থাপন না করে কেবল ডিএলএল ফাইলটি প্রতিস্থাপন করুন)।

আপনি যখনই কোনও ডায়নামিক লাইব্রেরি ব্যবহার করার কারণ না পান আপনি একটি স্থির গ্রন্থাগার ব্যবহার করবেন।


আপনি যখন ডিএলএল ব্যবহার করতে পারেন তখন একাধিক অন্যান্য অ্যাপ্লিকেশন একই কার্যকারিতা ব্যবহার করে - এটি পায়ের ছাপ হ্রাস করতে পারে।
টিম

এছাড়াও, আপনার প্রাথমিক ধারণাটি বাড়ানো, "প্লাগ-ইন" ​​আর্কিটেকচার যেখানে আপনি পুনর্নির্মাণ বা পুনরায় প্রকাশ না করে পরে যুক্ত / অজানা কার্যকারিতা মঞ্জুর করতে চান কেবল গতিশীল লাইব্রেরি দিয়েই করা যেতে পারে।
টিম

8

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


5

এই বিষয়ে একটি চমৎকার আলোচনার জন্য সূর্যের এই নিবন্ধটি পড়ুন

এটি ইন্টারপোসিং লাইব্রেরি সন্নিবেশ করানো সহ সকল সুবিধার মধ্যে চলে যায়। ইন্টারপোসিং সম্পর্কিত আরও বিশদ এখানে এই নিবন্ধে পাওয়া যাবে


4

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


3

যদি আপনার গ্রন্থাগারটি বেশ কয়েকটি এক্সিকিউটেবলের মধ্যে ভাগ করা যায়, তবে প্রায়শই এক্সিকিউটেবলের আকার হ্রাস করতে এটিকে গতিশীল করার অর্থ হয়। অন্যথায়, অবশ্যই এটি স্থির করুন।

একটি dll ব্যবহার করার বিভিন্ন অসুবিধা আছে। এটি লোড এবং আনলোড করার জন্য অতিরিক্ত ওভারহেড রয়েছে। অতিরিক্ত নির্ভরতাও রয়েছে। যদি আপনি ডেলিকে আপনার এক্সিকিউটিভের সাথে সঙ্গতিপূর্ণ না করে তা পরিবর্তন করেন তবে তারা কাজ করা বন্ধ করে দেবে। অন্যদিকে, আপনি যদি একটি স্ট্যাটিক লাইব্রেরি পরিবর্তন করেন তবে পুরানো সংস্করণ ব্যবহার করে আপনার সংকলিত এক্সিকিউটেবলগুলি প্রভাবিত হবে না।


3

লাইব্রেরিটি যদি স্থির থাকে তবে লিঙ্কের সময়ে কোডটি আপনার কার্যকর করার সাথে যুক্ত হয়। এটি আপনার এক্সিকিউটেবলকে আরও বড় করে তোলে (আপনি যদি গতিশীল পথে চলে যান তবে তার চেয়ে বেশি)।

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

আপনি যদি স্ট্যাটিক লাইব্রেরির সাথে থাকতে পারেন তবে স্থির লাইব্রেরির সাথে যান।


3

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

  • ধীর সূচনা (> 10 সেকেন্ড)
  • ডিএলএল'র সংস্করণ তৈরি করতে হয়েছিল, যেহেতু উইন্ডোজ নামের স্বতন্ত্রতায় মডিউলগুলি লোড করে। নিজস্ব লিখিত উপাদানগুলি অন্যথায় ডিএলএল এর ভুল সংস্করণ পাবে (যেমন তার নিজস্ব বিতরণের সেটটির পরিবর্তে ইতিমধ্যে একটি লোড করা হয়েছে)
  • অপ্টিমাইজার কেবলমাত্র ডিএলএল সীমানার মধ্যে অনুকূল করতে পারে। উদাহরণস্বরূপ অপ্টিমাইজারটি প্রায়শই ব্যবহৃত ডেটা এবং কোড একে অপরের পাশে রাখার চেষ্টা করে তবে এটি ডিএলএল সীমানা জুড়ে কাজ করবে না

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

  • উদাহরণ শেয়ার্ড_লিব 1, ভাগ করে নেওয়া_লিব 2 ব্যবহার করে
  • শেয়ার_লিব 1 শেয়ার_লিব 2 ব্যবহার করুন
  • shared_lib2

ভাগ করা_লিব 2 এর কোড এবং ভেরিয়েবলগুলি একবারে চূড়ান্ত মার্জ এক্সিকিউটেবলের মধ্যে উপস্থিত থাকতে হবে। এই প্রশ্ন কেউ সমর্থন করতে পারেন?


কোড অনুলিপি এড়ানোর জন্য আপনি কি কোনওভাবে প্রাক-সংকলক নির্দেশিকা ব্যবহার করতে চাইছেন না?
পেসম্যান

আফায়াক প্রাকম্পম্পাইলিং কেবলমাত্র প্রতি মডিউল (উদাহরণ / dll / lib) ভিত্তিতে কাজ করে। প্রাকম্পম্পাইলিংটি মূলত সংকলন গতি বাড়ানোর জন্য বোঝানো হয় যদিও এটি সংকলনের ইউনিটের মধ্যে একাধিক অন্তর্ভুক্তিকে বাধা দেয়। তবে অন্তর্ভুক্ত রক্ষীরা এই প্রভাবটি অর্জনের সর্বোত্তম উপায়।
gast128

2

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


2

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


2

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

আপনার যদি এমন একটি লাইব্রেরি থাকে যা পুরো কোডবেসের (যেমন কোনও তৃতীয় পক্ষের লাইব্রেরি) থেকে সম্পূর্ণ আলাদা থাকে তবে এটি একটি ডিএল তৈরির কথা বিবেচনা করুন। লাইব্রেরিটি যদি এলজিপিএল হয় তবে লাইসেন্সিং শর্তের কারণে আপনার যে কোনও উপায়ে dll ব্যবহার করতে হতে পারে।

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