আরবী ভাষায়
লিনাক্স-এ, ar
জিএনইউ সাধারণ উদ্দেশ্য ধনুবিদ। ( ar
অন্যান্য ইউনিক্সের মতো ওএসে নন-জিএনইউ ভেরিয়েন্ট রয়েছে )। বিকল্প সহc
ar c... archive-name file...
এটির একটি অনুলিপি তৈরি করে যার কপি রয়েছে file...
। archive-name
সাধারনত কিন্তু অবশ্যম্ভাবীরূপে এক্সটেনশন .a
(জন্য সংরক্ষণাগার )। প্রত্যেকটি file...
যে কোনও ধরণের ফাইল হতে পারে, অগত্যা কোনও অবজেক্ট ফাইল নয়।
সংরক্ষণাগারভুক্ত ফাইলগুলি যখন সমস্ত অবজেক্ট ফাইল হয় সাধারণত প্রোগ্রাম বা ডিএসও (ডায়নামিক শেয়ার্ড অবজেক্টস) এর লিঙ্কে অবজেক্ট ফাইলের সেই নির্বাচন প্রদান করার জন্য সংরক্ষণাগারটি ব্যবহার করার উদ্দেশ্য হয়। এই ক্ষেত্রে archive-name
এছাড়াও সাধারনত উপসর্গ দেওয়া হবে lib
, যেমন
libfoo.a
, যাতে এটি linker বিকল্পের মাধ্যমে একটি প্রার্থী linker ইনপুট ফাইল হিসাবে আবিষ্কার করা যেতে পারে -lfoo
।
লিঙ্কার ইনপুট ফাইল হিসাবে ব্যবহৃত হয়, libfoo.a
সাধারণত একটি স্ট্যাটিক লাইব্রেরি বলা হয় । এই ব্যবহার অযোগ্য প্রোগ্রামারদের কাছে বিভ্রান্তির চিরস্থায়ী উত্স, কারণ এটি তাদের মনে করে যে আর্কাইভটি libfoo.a
ডিএসওর মতো একই ধরণের জিনিস libfoo.so
, সাধারণত ডাইনামিক / শেয়ার্ড লাইব্রেরি নামে পরিচিত , এবং এই ভিত্তিতে মিথ্যা প্রত্যাশা তৈরি করতে। আসলে একটি "স্ট্যাটিক লাইব্রেরি" এবং "ডায়নামিক লাইব্রেরি" একেবারে অনুরূপ জিনিস নয় এবং একেবারে বিভিন্ন উপায়ে লিঙ্কেজে ব্যবহৃত হয়।
একটি সুস্পষ্ট পার্থক্য হ'ল স্ট্যাটিক লাইব্রেরি লিঙ্কার দ্বারা উত্পাদিত হয় না , তবে দ্বারা ar
। সুতরাং কোনও সংযোগ ঘটে না, কোনও প্রতীক রেজোলিউশন হয় না। সংরক্ষণাগারযুক্ত অবজেক্ট ফাইলগুলি অপরিবর্তিত রয়েছে: সেগুলি কেবল একটি ব্যাগে রাখা হয়েছে।
যখন একটি সংরক্ষণাগার এমন কিছু বিষয় যা এর দুটো ঘটনার ইনপুট হয় হয় এমন একটা প্রোগ্রাম বা DSO যেমন - - linker দ্বারা উত্পাদিত ব্যাগে linker সৌন্দর্য যদি তাতে কোন বস্তুর ফাইল অমীমাংসিত প্রতীক রেফারেন্স যে জমা হয়েছে সংজ্ঞা প্রদান দেখতে লিঙ্কেজ আগে। যদি এটি কোনও সন্ধান করে তবে এটি ব্যাগ থেকে object অবজেক্ট ফাইলগুলি বের করে এবং আউটপুট ফাইলে তাদের লিঙ্ক করে , ঠিক যেমনটি লিঙ্কার কমান্ডলাইনে এবং আর্কাইভের কোনও উল্লেখ নেই। সুতরাং লিংকেজে আর্কাইভের পুরো ভূমিকা হ'ল অবজেক্ট ফাইলগুলির ব্যাগ হিসাবে যা থেকে লিঙ্কারটি লিঙ্কেজটি বহন করার জন্য প্রয়োজনীয় এটি নির্বাচন করতে পারে।
ডিফল্টরূপে, জিএনইউ ar
তার আউটপুট সংরক্ষণাগারটিকে লিঙ্কার ইনপুট হিসাবে ব্যবহারের জন্য প্রস্তুত করে তোলে। এটি একটি যাদু ফোনি ফাইল নাম সহ সংরক্ষণাগারটিতে একটি ফনি "ফাইল" যুক্ত করে এবং এই ফোনি ফাইলে এটি লিখিতরূপে এমন লিখিত সামগ্রী লিখিত হয় যে আর্কাইভের কোনও অবজেক্ট ফাইল দ্বারা সংজ্ঞায়িত গ্লোবাল প্রতীকগুলি থেকে লকিং টেবিল হিসাবে পড়তে সক্ষম হয় সংরক্ষণাগারে object অবজেক্ট ফাইলগুলির নাম এবং অবস্থান। এই সন্ধানের টেবিলটি হ'ল লিঙ্কারটিকে সংরক্ষণাগারটি সন্ধান করতে এবং হস্তান্তরিত কোন সমাধান না হওয়া প্রতীক উল্লেখগুলি সংজ্ঞায়িত করে এমন কোনও বস্তুর ফাইল সনাক্ত করতে সক্ষম করে।
আপনি q
(=
দ্রুত ) বিকল্পটি - যা বাস্তবে আপনি নিজের ar
উদাহরণে ব্যবহার করেছেন - এবং এছাড়াও (মূলধন) S
(= কোনও প্রতীক টেবিল ) বিকল্পের সাহায্যে এই অনুসন্ধান সারণীর তৈরি বা আপডেটকে দমন করতে পারেন । এবং যদি আপনি ar
কোনও সংরক্ষণাগার তৈরি বা আপডেট করার জন্য অনুরোধ করেন যা কোনও কারণে (একটি uptodate) প্রতীক টেবিলটি পায় নি, তবে আপনি s
বিকল্পটি দিয়ে এটি দিতে পারেন ।
ranlib
ranlib
মোটেও লাইব্রেরি তৈরি করে না। লিনাক্স-এ, ranlib
একটি লিগ্যাসি প্রোগ্রাম যা কোনও ar
সংরক্ষণাগারে একটি (আপডোটেট) প্রতীক টেবিল যুক্ত করে যদি এটি না থাকে। এটা তোলে এর প্রভাব হিসাবে একই ঠিক ar s
গনুহ সঙ্গে, ar
। Icallyতিহাসিকভাবে , এর আগে ar
নিজেই একটি প্রতীক টেবিল তৈরির জন্য সজ্জিত ranlib
ছিল, সেই কলডেজটি ছিল যা লিঙ্কারটিকে তার থেকে অবজেক্ট ফাইলগুলি বাছাই করতে সক্ষম করার জন্য একটি সংরক্ষণাগারটিতে জাদু ফোনি ফাইলটি ইনজেক্ট করেছিল। নন-জিএনইউ ইউনিক্স-এর মতো ওএসে, ranlib
এখনও এই উদ্দেশ্যে প্রয়োজন হতে পারে। আপনার উদাহরণ:
ar qc libgraphics.a *.o
ranlib libgraphics.a
বলেছেন:
- বর্তমান ডিরেক্টরিতে
libgraphics.a
সমস্ত *.o
ফাইল সংরক্ষণাগারে সংযুক্ত করে তৈরি করুন , কোনও চিহ্ন সারণী ছাড়াই।
- তারপরে একটি প্রতীক টেবিল যুক্ত করুন
libgraphics.a
লিনাক্সে, এর একই নেট প্রভাব রয়েছে:
ar cr libgraphics.a *.o
নিজেই, ar qc libgraphics.a *.o
একটি সংরক্ষণাগার তৈরি করে যা লিঙ্কারটি ব্যবহার করতে পারে না, কারণ এর কোনও চিহ্ন টেবিল নেই।
lD
আপনার উদাহরণ:
ld -r -o libgraphics.a *.o
আসলে বেশ নিরপেক্ষ। হয়তো এই ব্যাপারে বিরল ব্যবহার প্রকাশ linker ,
ld
, একটি উত্পাদন করতে মার্জ একটি একক আউটপুট বস্তুর ফাইল, যা প্রতীক রেজল্যুশন সম্পন্ন করা হয়েছে বা একাধিক ইনপুট ফাইল লিঙ্ক করে বস্তুর ফাইল যতদূর সম্ভব হিসাবে , ইনপুট ফাইল দেওয়া। -r
(= Relocatable ) বিকল্প linker linkaqe ব্যর্থ যদি অনির্ধারিত প্রতীক রেফারেন্স আউটপুট ফাইল থাকা যতটা সম্ভব এবং ইনপুট লিঙ্ক করে একটি বস্তু ফাইল টার্গেট (বদলে একটি প্রোগ্রাম, অথবা DSO) উত্পাদন করতে নির্দেশ দেয়। এই ব্যবহারকে আংশিক সংযোগ বলা হয় ।
আউটপুট ফাইল ld -r ...
একটি বস্তু ফাইল, কোনো হয় ar
সংরক্ষণাগার , এবং একটি আউটপুট ফাইলের নাম যে নির্দিষ্ট রূপ একটি মত ar
সংরক্ষণাগার এটা এক দেখা যায় না। সুতরাং আপনার উদাহরণ একটি প্রতারণার চিত্রিত করে। এই:
ld -r -o graphics.o *.o
সত্যবাদী হবে। এ জাতীয় প্রতারণার উদ্দেশ্য কী হতে পারে তা আমার কাছে অস্পষ্ট, কারণ কোনও ইএলএফ অবজেক্ট ফাইল বলা হলেও libgraphics.a
, এবং এই নামটি দ্বারা বা কোনও সংযোগের ইনপুট -lgraphics
হলেও লিঙ্কারটি এটি সঠিকভাবে ELF অবজেক্ট ফাইল হিসাবে সনাক্ত করবে , একটি না ar
সংরক্ষণাগার, এবং এটি গ্রাস করবে তা কমান্ড যে কোন বস্তুর ফাইল হ্রাস: এটা, নিঃশর্তভাবে এটা সংযোগ আউটপুট ফাইলে যেহেতু একটি জেনুইন সংরক্ষণাগার ইনপুট করার বিন্দু লিংক আর্কাইভ সদস্যদের হয় শুধুমাত্র এই শর্তে যে তারা রেফারেন্সড হয় । সম্ভবত আপনার এখানে অসতর্কিত লিঙ্ক দেওয়ার উদাহরণ রয়েছে।
মোড়ক উম্মচন...
আমরা আসলে এমন কিছু উত্পাদন করার একটি উপায় দেখেছি যা প্রচলিতভাবে গ্রন্থাগার বলা হয় এবং এটি একটি তথাকথিত স্ট্যাটিক লাইব্রেরির উত্পাদন , কিছু অবজেক্ট ফাইল সংরক্ষণাগারভুক্ত করে এবং সংরক্ষণাগারে একটি প্রতীক টেবিল রেখে।
এবং আমরা কীভাবে প্রথাগতভাবে একটি লাইব্রেরি নামে ডাকে ডায়নামিক শেয়ার্ড অবজেক্ট / শেয়ার্ড লাইব্রেরি / ডায়নামিক লাইব্রেরি নামে অন্যান্য এবং সবচেয়ে গুরুত্বপূর্ণ ধরণের জিনিস তৈরি করতে পারি তা কিছুই দেখিনি ।
একটি প্রোগ্রামের মতো, ডিএসও লিঙ্কার দ্বারা উত্পাদিত হয় । একটি প্রোগ্রাম এবং একটি ডিএসও হ'ল ইএলএফ বাইনারিগুলির রূপগুলি যা ওএস লোডার বোঝে এবং চলমান প্রক্রিয়াটি একত্রিত করতে ব্যবহার করতে পারে। সাধারণত আমরা এক জিসিসি frontends এক (মাধ্যমে linker ডাকা gcc
, g++
, gfortran
, ইত্যাদি):
একটি প্রোগ্রাম লিঙ্ক:
gcc -o prog file.o ... -Ldir ... -lfoo ...
একটি ডিএসও সংযোগ:
gcc -shared -o libbar.so file.o ... -Ldir ... -lfoo ...
-lfoo
আপনি যখন অন্য কোনও প্রোগ্রাম বা ডিএসও সংযোগ করছেন তখন ভাগ করা লাইব্রেরি এবং স্থির গ্রন্থাগারগুলি ইউনিফর্ম প্রোটোকল দ্বারা লিঙ্কারের কাছে দেওয়া যেতে পারে । এই বিকল্পটি লিঙ্কারকে তার নির্দিষ্ট বা ডিফল্ট অনুসন্ধান ডিরেক্টরিগুলি হয় libfoo.so
বা এটির জন্য স্ক্যান করতে নির্দেশ দেয়
libfoo.a
। ডিফল্টরূপে, একবার তাদের কোনওটির সন্ধান পেলে তা ফাইলটিকে লিঙ্কেজে ইনপুট দেবে এবং যদি এটি একই অনুসন্ধান ডিরেক্টরিতে উভয়কে খুঁজে পায় তবে এটি পছন্দ করবে libfoo.so
। যদি libfoo.so
, নির্বাচিত হয় তবে লিঙ্কার যুক্ত করে যে আপনি যে কোনও প্রোগ্রাম বা ডিএসও তৈরি করছেন তার রানটাইম নির্ভরতা তালিকায় ডিএসও যুক্ত করে। যদি libfoo.a
নির্বাচিত হয় তবে লিঙ্কার আর্কাইভটি আউটপুট ফাইলের সংযোগের জন্য অবজেক্ট ফাইলের নির্বাচন হিসাবে ব্যবহার করে, প্রয়োজনে, ঠিক তখনই ব্যবহার করে। কোনও রানটাইম নির্ভরতা নেই
libfoo.a
নিজেই সম্ভব; এটি কোনও প্রক্রিয়াতে ম্যাপ করা যায় না; এটি ওএস লোডারকে কিছুই বোঝায় না।
Https://stackoverflow.com/a/47924864/195787 থেকে অনুলিপি করা হয়েছে ।