সি ++ এ শ্রেণিবদ্ধ গ্রন্থাগার তৈরি করার সময় আপনি গতিশীল ( .dll
, .so
) এবং স্ট্যাটিক ( .lib
, .a
) লাইব্রেরির মধ্যে বেছে নিতে পারেন। তাদের মধ্যে পার্থক্য কী এবং কখন ব্যবহার করা উপযুক্ত?
সি ++ এ শ্রেণিবদ্ধ গ্রন্থাগার তৈরি করার সময় আপনি গতিশীল ( .dll
, .so
) এবং স্ট্যাটিক ( .lib
, .a
) লাইব্রেরির মধ্যে বেছে নিতে পারেন। তাদের মধ্যে পার্থক্য কী এবং কখন ব্যবহার করা উপযুক্ত?
উত্তর:
স্ট্যাটিক লাইব্রেরি আপনার বাইনারি কোডের আকার বাড়ায়। এগুলি সর্বদা লোড হয় এবং আপনি যে কোডটি সংকলিত করেছেন তার সংস্করণ হ'ল কোডটির সংস্করণ version
ডায়নামিক লাইব্রেরিগুলি পৃথকভাবে সঞ্চয় এবং সংস্করণ করা হয়। ডায়নামিক লাইব্রেরির এমন কোনও ভার্সনটি লোড করা সম্ভব যা আপডেটটি মূল সংস্করণের সাথে বাইনারি সামঞ্জস্যপূর্ণ বলে বিবেচিত হলে আপনার কোডটি প্রেরণ করা মূলটি নয় was
অতিরিক্তভাবে ডায়নামিক লাইব্রেরিগুলি প্রয়োজনীয়ভাবে লোড করা হয় না - এগুলি সাধারণত প্রথম বলা হলে লোড করা হয় - এবং একই লাইব্রেরি ব্যবহার করে এমন উপাদানগুলির মধ্যে ভাগ করা যায় (একাধিক ডেটা লোড, একটি কোড লোড)।
ডায়নামিক লাইব্রেরিগুলি বেশিরভাগ সময় উন্নত পদ্ধতির হিসাবে বিবেচিত হত, তবে মূলত তাদের একটি বড় ত্রুটি ছিল (গুগল ডিএলএল হেল্ক), যা সমস্ত সাম্প্রতিক উইন্ডোজ ওএস (বিশেষত উইন্ডোজ এক্সপি) দ্বারা মুছে ফেলা হয়েছে।
স্ট্যাটিক লাইব্রেরি কী তা অন্যরা পর্যাপ্তরূপে ব্যাখ্যা করেছেন, তবে আমি কমপক্ষে উইন্ডোজে স্ট্যাটিক লাইব্রেরি ব্যবহারের কিছু সতর্কতা উল্লেখ করতে চাই:
সিলেটলেটস: যদি কোনও বিশ্বব্যাপী / স্ট্যাটিক এবং অনন্য হতে হয় তবে এটি একটি স্ট্যাটিক লাইব্রেরিতে রাখার বিষয়ে খুব সাবধানতা অবলম্বন করুন। যদি স্থির লাইব্রেরির সাথে একাধিক ডিএলএল সংযুক্ত থাকে তবে তারা প্রত্যেকে সিঙ্গলটনের নিজস্ব অনুলিপি পাবে। তবে, যদি আপনার অ্যাপ্লিকেশনটি কোনও কাস্টম ডিএলএলবিহীন একক EXE হয়, তবে এটি সমস্যা নাও হতে পারে।
অযৌক্তিক কোড অপসারণ: আপনি যখন কোনও স্ট্যাটিক লাইব্রেরির সাথে লিঙ্ক করেন, কেবল তখনই আপনার স্ট্রাইক লাইব্রেরির অংশগুলি আপনার ডিএলএল / এএসইই দ্বারা উল্লিখিত হয় তবে আপনার ডিএলএল / এক্সের সাথে সংযুক্ত হয়ে যাবে।
উদাহরণস্বরূপ, যদি mylib.lib
থাকে a.obj
এবং b.obj
এবং আপনার ডিএলএল / EXE এর শুধুমাত্র রেফারেন্স ফাংশন বা থেকে ভেরিয়েবল a.obj
, এর সম্পূর্ণতা b.obj
linker দ্বারা বাতিল করা হবে। যদি b.obj
গ্লোবাল / স্ট্যাটিক অবজেক্ট থাকে তবে তাদের কনস্ট্রাক্টর এবং ডেস্ট্রাক্টরগুলি কার্যকর করা হবে না। যদি সেই নির্মাণকারী / ধ্বংসকারীদের পার্শ্ব প্রতিক্রিয়া থাকে তবে আপনি তাদের অনুপস্থিতিতে হতাশ হতে পারেন।
তেমনি, যদি স্থির লাইব্রেরিতে বিশেষ এন্ট্রিপয়েন্ট থাকে তবে সেগুলি অবশ্যই অন্তর্ভুক্ত রয়েছে সেদিকে আপনার যত্ন নেওয়া দরকার। এম্বেড থাকা প্রোগ্রামিংয়ের এটির উদাহরণ (ঠিক আছে, উইন্ডোজ নয়) একটি বাধা হ্যান্ডলার হবে যা নির্দিষ্ট ঠিকানায় চিহ্নিত হয়েছে। আপনার বিঘ্নিত হ্যান্ডলারটি এন্ট্রিপয়েন্ট হিসাবে চিহ্নিত করতে হবে যাতে এটি ফেলে দেওয়া হয় না তা নিশ্চিত করে।
এর আর একটি পরিণতি হ'ল স্থির লাইব্রেরিতে এমন অবজেক্ট ফাইল থাকতে পারে যা অমীমাংসিত রেফারেন্সের কারণে পুরোপুরি অব্যবহারযোগ্য, তবে আপনি যদি সেই সমস্ত অবজেক্ট ফাইল থেকে কোনও ফাংশন বা পরিবর্তনশীল উল্লেখ না করেন তবে এটি কোনও লিঙ্কারের ত্রুটির কারণ হবে না। এটি গ্রন্থাগারটি লেখার অনেক পরে হতে পারে।
ডিবাগ প্রতীক: আপনি প্রতিটি স্ট্যাটিক লাইব্রেরির জন্য পৃথক পিডিবি চাইবেন, বা আপনি ডিবাগ প্রতীকগুলি বস্তু ফাইলগুলিতে স্থাপন করতে চান যাতে তারা ডিএলএল / এএসইই জন্য পিডিবিতে রোলড হয়। ভিজ্যুয়াল সি ++ ডকুমেন্টেশন প্রয়োজনীয় বিকল্পগুলি ব্যাখ্যা করে ।
আরটিটিআই: আপনি type_info
যদি একক স্ট্যাটিক লাইব্রেরিকে একাধিক ডিএলএলে লিঙ্ক করেন তবে আপনি একই বর্গের একাধিক অবজেক্টের সাথে শেষ করতে পারেন। যদি আপনার প্রোগ্রামটি ধরে নেয় যে type_info
এটি "সিঙ্গেলটন" ডেটা এবং ব্যবহারগুলি &typeid()
বা type_info::before()
, আপনি অনাকাঙ্ক্ষিত এবং আশ্চর্যজনক ফলাফল পেতে পারেন।
একটি লিবিব কোডের একটি ইউনিট যা আপনার প্রয়োগের মধ্যে কার্যকর হয়।
একটি dll এক্সিকিউটেবল কোডের একক ইউনিট। কোডটিতে কল করা হলেই এটি প্রক্রিয়াতে লোড হয়। একটি ডিএল একাধিক অ্যাপ্লিকেশন দ্বারা ব্যবহার করা যেতে পারে এবং একাধিক প্রসেসে লোড করা যায়, যখন এখনও হার্ড ড্রাইভে কোডের কেবল একটি অনুলিপি থাকে।
ডেল পেশাদার : বিভিন্ন পণ্যের মধ্যে কোড পুনরায় ব্যবহার / ভাগ করতে ব্যবহার করা যেতে পারে; চাহিদা অনুযায়ী প্রক্রিয়া মেমরি লোড এবং প্রয়োজন হবে না যখন আনলোড করা যেতে পারে; প্রোগ্রামের বাকি অংশগুলির থেকে স্বাধীনভাবে আপগ্রেড করা যায়।
Dll কনস : dll লোডিং এবং কোড রিবেসিং এর কর্মক্ষমতা প্রভাব; সংস্করণ সমস্যা ("ডেল হেল")
লিব পেশাদাররা : কোডটি প্রক্রিয়াটিতে সর্বদা লোড থাকে এবং পুনরায় সেট করা হয় না বলে কোনও কার্যকারিতা প্রভাবিত করে না; সংস্করণ সমস্যা নেই
লিব কনস : এক্সিকিউটেবল / প্রসেস "ফোলা" - সমস্ত কোড আপনার এক্সিকিউটেবলে থাকে এবং প্রক্রিয়া শুরু হওয়ার পরে লোড হয়; কোনও পুনঃব্যবহার / ভাগ করে নেওয়ার নয় - প্রতিটি পণ্যটির কোডের নিজস্ব কপি থাকে।
স্ট্যাটিক বনাম গতিশীল লাইব্রেরিগুলির প্রযুক্তিগত বিপর্যয় ছাড়াও (স্ট্যাটিক ফাইলগুলি এক বিশাল বাইনারি বনাম ডায়নামিক লাইব্রেরিগুলিতে সমস্ত কিছু বান্ডিল করে যা বেশ কয়েকটি বিভিন্ন এক্সিকিউটেবলের মধ্যে কোড ভাগ করে নেওয়ার অনুমতি দেয়) এর আইনী জটিলতাও রয়েছে ।
উদাহরণস্বরূপ, যদি আপনি এলজিপিএল লাইসেন্স কোড ব্যবহার করেন এবং আপনি কোনও এলজিপিএল লাইব্রেরির বিরুদ্ধে স্ট্যাটিকভাবে লিঙ্ক করেন (এবং এইভাবে একটি বড় বাইনারি তৈরি করেন), আপনার কোডটি স্বয়ংক্রিয়ভাবে ওপেন সর্সড ( স্বাধীনতার মতো মুক্ত) এলজিপিএল কোড হয়ে যায়। আপনি যদি কোনও ভাগ করা অবজেক্টগুলির সাথে লিঙ্ক করেন, তবে আপনাকে কেবলমাত্র এলজিপিএল লাইব্রেরিতে নিজের তৈরি করা উন্নতিগুলি / বাগ ফিক্সগুলি LGPL করতে হবে।
আপনি যদি মোবাইল অ্যাপ্লিকেশনগুলি সংকলন করতে চান তবে উদাহরণস্বরূপ (অ্যান্ড্রয়েডে আপনার কাছে স্ট্যাটিক বনাম ডায়নামিকের একটি পছন্দ রয়েছে, আইওএসে আপনি যা করেন না - এটি সর্বদা স্থির থাকে) এটি আরও বেশি গুরুত্বপূর্ণ সমস্যা হয়ে ওঠে।
সি ++ প্রোগ্রাম দুটি ধাপে নির্মিত
স্ট্যাটিক লাইব্রেরি (.lib) হ'ল .obj ফাইলগুলির একটি বান্ডিল এবং এটি একটি সম্পূর্ণ প্রোগ্রাম নয়। এটি কোনও প্রোগ্রাম তৈরির দ্বিতীয় (লিঙ্কিং) পর্যায়ে যায় নি। অন্যদিকে, ডেলগুলি এক্সের মতো এবং তাই সম্পূর্ণ প্রোগ্রাম।
আপনি যদি একটি স্ট্যাটিক লাইব্রেরি তৈরি করেন তবে এটি এখনও লিঙ্কযুক্ত নয় এবং তাই আপনার স্থির গ্রন্থাগারের গ্রাহকদের আপনার ব্যবহৃত একই সংকলকটি ব্যবহার করতে হবে (আপনি যদি জি ++ ব্যবহার করেন তবে তাদের জি ++ ব্যবহার করতে হবে)।
পরিবর্তে আপনি যদি একটি ডেল তৈরি করেন (এবং এটি সঠিকভাবে তৈরি করেছেন ) তবে আপনি একটি সম্পূর্ণ প্রোগ্রাম তৈরি করেছেন যা সমস্ত গ্রাহকরা ব্যবহার করতে পারেন, তারা কোন সংকলক ব্যবহার করছেন তা বিবেচনা করেই নয়। ক্রস সংকলক সামঞ্জস্যতা পছন্দসই হলে, একটি ডেল থেকে রফতানি করার ক্ষেত্রে বেশ কয়েকটি বিধিনিষেধ রয়েছে।
consumers of your static library will have to use the same compiler that you used
স্ট্যাটিক গ্রন্থাগার যেমন সি ++ লাইব্রেরি ব্যবহার করে #include <iostream>
।
$$:~/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]>
একটি স্ট্যাটিক লাইব্রেরি ক্লায়েন্টে সংকলিত হয়। একটি .lib সংকলন সময়ে ব্যবহার করা হয় এবং গ্রন্থাগারের বিষয়বস্তু গ্রাহক এক্সিকিউটেবল অংশ হয়ে।
একটি ডায়নামিক লাইব্রেরি রানটাইমে লোড হয় এবং ক্লায়েন্টের এক্সিকিউটেবলের মধ্যে সংকলিত হয় না। ডায়নামিক লাইব্রেরিগুলি আরও নমনীয় কারণ একাধিক ক্লায়েন্ট এক্সিকিউটেবলগুলি একটি ডিএলএল লোড করতে পারে এবং এর কার্যকারিতাটি ব্যবহার করতে পারে। এটি আপনার ক্লায়েন্ট কোডের সামগ্রিক আকার এবং রক্ষণাবেক্ষণকে সর্বনিম্ন রাখে।
সময়ের সাথে সাথে সংস্করণ, স্থিতিশীলতা, সামঞ্জস্যতা ইত্যাদির বিষয়ে আপনার সাবধানে চিন্তা করা উচিত
যদি দুটি অ্যাপ্লিকেশন রয়েছে যা ভাগ করে দেওয়া কোড ব্যবহার করে, আপনি কি সেই অ্যাপ্লিকেশনগুলিকে একে অপরের সাথে সামঞ্জস্যপূর্ণ হওয়ার প্রয়োজনে একসাথে পরিবর্তন করতে বাধ্য করতে চান? তারপরে dll ব্যবহার করুন। সমস্ত EXE একই কোড ব্যবহার করবে।
অথবা আপনি কি একে অপরের থেকে বিচ্ছিন্ন করতে চান, যাতে আপনি একজনকে পরিবর্তন করতে পারেন এবং আত্মবিশ্বাসী হতে পারেন যে আপনি অন্যটিকে ভাঙ্গেননি। তারপরে স্ট্যাটিক লিব ব্যবহার করুন।
ডিএলএল জাহান্নাম হ'ল যখন আপনি সম্ভবত একটি স্ট্যাটিক লিব ব্যবহার করা উচিত, তবে আপনি তার পরিবর্তে একটি ডেল ব্যবহার করেছিলেন, এবং সমস্ত এক্সেসগুলি এর সাথে সমবেত হয় না।
একটি স্ট্যাটিক লাইব্রেরি অবশ্যই চূড়ান্ত নির্বাহের সাথে সংযুক্ত করা উচিত; এটি এক্সিকিউটেবলের অংশ হয়ে যায় এবং যেখানেই যায় সেখানে অনুসরণ করে। একটি ডায়নামিক লাইব্রেরি প্রতিটি সময় এক্সিকিউটেবল কার্যকর করার সময় লোড হয় এবং ডিএলএল ফাইল হিসাবে এক্সিকিউটেবল থেকে পৃথক থাকে।
আপনি যখন একটি এক্সিকিউটেবলকে পুনরায় লিঙ্ক না করে লাইব্রেরির প্রদত্ত কার্যকারিতাটি পরিবর্তন করতে সক্ষম হতে চান তখন আপনি একটি ডিএলএল ব্যবহার করবেন (এক্সিকিউটেবল ফাইলটি প্রতিস্থাপন না করে কেবল ডিএলএল ফাইলটি প্রতিস্থাপন করুন)।
আপনি যখনই কোনও ডায়নামিক লাইব্রেরি ব্যবহার করার কারণ না পান আপনি একটি স্থির গ্রন্থাগার ব্যবহার করবেন।
" ভাগ করে নেওয়া গ্রন্থাগারগুলি কীভাবে লিখবেন " সম্পর্কিত আলরিচ ড্র্রেপারের কাগজটিও ভাল সম্পদ যা ভাগ করে নেওয়া লাইব্রেরিগুলির কীভাবে সর্বোত্তমভাবে ব্যবহার করা যায় বা কীভাবে তিনি "ডায়নামিক শেয়ার্ড অবজেক্টস" (ডিএসও) হিসাবে উল্লেখ করেন তা বিশদে রয়েছে। এটি ইএলএফ বাইনারি ফর্ম্যাটে ভাগ করা লাইব্রেরিগুলিতে আরও ফোকাস করে তবে কিছু আলোচনা উইন্ডোজ ডিএলএল-তেও উপযুক্ত।
এই বিষয়ে একটি চমৎকার আলোচনার জন্য সূর্যের এই নিবন্ধটি পড়ুন
এটি ইন্টারপোসিং লাইব্রেরি সন্নিবেশ করানো সহ সকল সুবিধার মধ্যে চলে যায়। ইন্টারপোসিং সম্পর্কিত আরও বিশদ এখানে এই নিবন্ধে পাওয়া যাবে ।
সত্যই আপনি যে বাণিজ্য বন্ধ করছেন (একটি বৃহত প্রকল্পে) প্রাথমিক লোড টাইমে রয়েছে, গ্রন্থাগারগুলি এক সময় বা অন্য সময়ে সংযুক্ত হতে চলেছে, যে সিদ্ধান্ত নিতে হবে তা হল লিঙ্কটি সংকলকটির পক্ষে যথেষ্ট সময় লাগবে বুলেট কামড়ানোর জন্য এবং এটি সামনের কাজটি করতে, বা গতিশীল লিঙ্কার এটি লোড সময় করতে পারে।
যদি আপনার গ্রন্থাগারটি বেশ কয়েকটি এক্সিকিউটেবলের মধ্যে ভাগ করা যায়, তবে প্রায়শই এক্সিকিউটেবলের আকার হ্রাস করতে এটিকে গতিশীল করার অর্থ হয়। অন্যথায়, অবশ্যই এটি স্থির করুন।
একটি dll ব্যবহার করার বিভিন্ন অসুবিধা আছে। এটি লোড এবং আনলোড করার জন্য অতিরিক্ত ওভারহেড রয়েছে। অতিরিক্ত নির্ভরতাও রয়েছে। যদি আপনি ডেলিকে আপনার এক্সিকিউটিভের সাথে সঙ্গতিপূর্ণ না করে তা পরিবর্তন করেন তবে তারা কাজ করা বন্ধ করে দেবে। অন্যদিকে, আপনি যদি একটি স্ট্যাটিক লাইব্রেরি পরিবর্তন করেন তবে পুরানো সংস্করণ ব্যবহার করে আপনার সংকলিত এক্সিকিউটেবলগুলি প্রভাবিত হবে না।
লাইব্রেরিটি যদি স্থির থাকে তবে লিঙ্কের সময়ে কোডটি আপনার কার্যকর করার সাথে যুক্ত হয়। এটি আপনার এক্সিকিউটেবলকে আরও বড় করে তোলে (আপনি যদি গতিশীল পথে চলে যান তবে তার চেয়ে বেশি)।
লাইব্রেরিটি যদি গতিশীল হয় তবে লিঙ্কের সময়ে প্রয়োজনীয় পদ্ধতিগুলির জন্য রেফারেন্সগুলি আপনার এক্সিকিউটেবলের মধ্যে অন্তর্নির্মিত থাকে। এর অর্থ হ'ল আপনাকে আপনার এক্সিকিউটেবল এবং ডায়নামিক লাইব্রেরি পাঠাতে হবে। লাইব্রেরির কোডটিতে ভাগ করে নেওয়া অ্যাক্সেস নিরাপদ কিনা, অন্যান্য জিনিসগুলির মধ্যে পছন্দসই লোডের ঠিকানাটিও বিবেচনা করা উচিত।
আপনি যদি স্ট্যাটিক লাইব্রেরির সাথে থাকতে পারেন তবে স্থির লাইব্রেরির সাথে যান।
আমরা আমাদের প্রকল্পে প্রচুর ডিএলএল (> 100) ব্যবহার করি। এই ডিএলএলগুলির একে অপরের উপর নির্ভরশীলতা রয়েছে এবং তাই আমরা গতিশীল সংযোগ স্থাপন সেটআপ করেছি। তবে এর নিম্নলিখিত অসুবিধাগুলি রয়েছে:
সবকিছুকে একটি স্ট্যাটিক লাইব্রেরি বানানোর জন্য সম্ভবত আরও ভাল সেটআপ ছিল (এবং আপনার কেবলমাত্র একটি কার্যকরযোগ্য) কোনও কোডের সদৃশতা না ঘটলে এটি কাজ করে। একটি পরীক্ষা এই ধারণাটিকে সমর্থন করে বলে মনে হচ্ছে, তবে আমি কোনও এমএসডিএন অফিশিয়াল উদ্ধৃতি খুঁজে পাইনি। সুতরাং উদাহরণস্বরূপ 1 এক্স এর সাথে করুন:
ভাগ করা_লিব 2 এর কোড এবং ভেরিয়েবলগুলি একবারে চূড়ান্ত মার্জ এক্সিকিউটেবলের মধ্যে উপস্থিত থাকতে হবে। এই প্রশ্ন কেউ সমর্থন করতে পারেন?
স্ট্যাটিক লাইব্রেরি হ'ল সংরক্ষণাগার যা লাইব্রেরির জন্য অবজেক্ট কোড ধারণ করে, যখন কোনও অ্যাপ্লিকেশনটির সাথে লিঙ্ক করা হয় যে কোডটি এক্সিকিউটেবলের মধ্যে সংকলিত হয়। ভাগ করা লাইব্রেরিগুলি পৃথক পৃথক যেগুলি কার্যকর করার ক্ষেত্রে সংকলিত হয় না। পরিবর্তে ডায়নামিক লিঙ্কারটি প্রয়োজনীয় লাইব্রেরি (গুলি) সন্ধান করে কিছু ডিরেক্টরি অনুসন্ধান করে, তারপরে এটি মেমরিতে লোড হয়। তারপরে আরও একজন কার্যকর হতে পারে একই সাথে একই ভাগ করা লাইব্রেরিটি ব্যবহার করতে পারে, এইভাবে মেমরির ব্যবহার এবং এক্সিকিউটেবল আকার হ্রাস করতে পারে। তবে এক্সিকিউটেবলের সাথে বিতরণ করার জন্য আরও ফাইল রয়েছে। আপনাকে নিশ্চিত করতে হবে যে লিঙ্কারটি কোথাও ব্যবহারের সিস্টেমে ইনস্টল করা আছে যেখানে লিঙ্কার এটি সন্ধান করতে পারে, স্থির লিঙ্কিং এই সমস্যাটি সরিয়ে দেয় তবে এর ফলে একটি বৃহত্তর এক্সিকিউটেবল ফাইলের ফলাফল হয়।
যদি আপনার এম্বেড থাকা প্রকল্পগুলি বা বিশেষায়িত প্ল্যাটফর্মগুলির স্থির লাইব্রেরিগুলিতে কাজ করার একমাত্র উপায় হয়, তবে অনেক সময় আপনার অ্যাপ্লিকেশনটি সংকলন করতে কোনও ঝামেলা কম হয়। এছাড়াও সমস্ত কিছু অন্তর্ভুক্ত এমন প্রকল্প এবং মেকফিল রয়েছে যা জীবনকে আরও সুখী করে তোলে।
আমি থাম্বের একটি সাধারণ নিয়ম দিয়েছি যে যদি আপনার কাছে একটি বৃহত কোডবেস থাকে তবে সমস্ত নীচের স্তরের লাইব্রেরির উপরে নির্মিত (যেমন একটি ইউটিস বা গুই ফ্রেমওয়ার্ক), যা আপনি আরও পরিচালিত লাইব্রেরিতে বিভক্ত করতে চান তবে এগুলি স্থির গ্রন্থাগার তৈরি করুন। ডায়নামিক লাইব্রেরিগুলি আপনাকে সত্যিকার অর্থে কিছু কিনে না এবং কম চমক পাওয়া যায় - উদাহরণস্বরূপ কেবল একক একক দর্শন থাকবে।
আপনার যদি এমন একটি লাইব্রেরি থাকে যা পুরো কোডবেসের (যেমন কোনও তৃতীয় পক্ষের লাইব্রেরি) থেকে সম্পূর্ণ আলাদা থাকে তবে এটি একটি ডিএল তৈরির কথা বিবেচনা করুন। লাইব্রেরিটি যদি এলজিপিএল হয় তবে লাইসেন্সিং শর্তের কারণে আপনার যে কোনও উপায়ে dll ব্যবহার করতে হতে পারে।