• Program Library HOW TO

    Program Library HOWTO

    This HOWTO for programmers discusses how to create and use program libraries on Linux. This includes static libraries, shared libraries, and dynamically loaded libraries.

    ভূমিকা

    প্রোগ্রামারদের জন্য এই হাওটিও জিএনইউ টুলসেট ব্যবহার করে কীভাবে লিনাক্সে প্রোগ্রাম লাইব্রেরি তৈরি করতে এবং ব্যবহার করতে হয় তা নিয়ে আলোচনা করে। একটি `` প্রোগ্রাম লাইব্রেরি '' হ'ল সংকলিত কোড (এবং ডেটা) সম্বলিত একটি ফাইল যা পরে কোনও প্রোগ্রামে অন্তর্ভুক্ত করতে হয়; প্রোগ্রাম লাইব্রেরি প্রোগ্রামগুলিকে আরও মডিউল, পুনরায় সংযোগ করতে দ্রুত এবং আপডেট করা সহজ করে। প্রোগ্রাম লাইব্রেরিগুলিকে তিন প্রকারে বিভক্ত করা যায়: স্ট্যাটিক লাইব্রেরি, শেয়ার্ড লাইব্রেরি এবং গতিশীলভাবে লোড করা (ডিএল) লাইব্রেরি।
    এই কাগজটি প্রথমে স্ট্যাটিক লাইব্রেরিগুলি নিয়ে আলোচনা করে, যা প্রোগ্রাম চালানোর আগে এক্সিকিউটেবল প্রোগ্রামে ইনস্টল করা হয়। এরপরে এটি ভাগ করা লাইব্রেরিগুলি নিয়ে আলোচনা করে, যা প্রোগ্রামের শুরুতে লোড করা হয় এবং প্রোগ্রামগুলির মধ্যে ভাগ করা হয়। শেষ অবধি, এটি গতিশীল লোডযুক্ত (ডিএল) লাইব্রেরিগুলি নিয়ে আলোচনা করে, যা কোনও প্রোগ্রাম চলাকালীন যে কোনও সময় লোড এবং ব্যবহৃত হতে পারে। ডিএল লাইব্রেরিগুলি আসলে কোনও আলাদা লাইব্রেরির ফর্ম্যাট নয় (স্ট্যাটিক এবং শেয়ার্ড লাইব্রেরি উভয়ই ডিএল লাইব্রেরি হিসাবে ব্যবহার করা যেতে পারে); পরিবর্তে, পার্থক্যটি কীভাবে প্রোগ্রামাররা ডিএল লাইব্রেরি ব্যবহার করেন। হাওটো আরও উদাহরণ সহ একটি বিভাগ এবং তথ্যের অন্যান্য উত্সের রেফারেন্স সহ একটি বিভাগ দিয়ে গুটিয়ে রাখে।
    বেশিরভাগ বিকাশকারী যারা লাইব্রেরি বিকাশ করছেন তাদের ভাগ করা লাইব্রেরি তৈরি করা উচিত, যেহেতু এটি ব্যবহারকারীরা তাদের লাইব্রেরিগুলি অ্যাপ্লিকেশনগুলি যা লাইব্রেরি ব্যবহার করে তাদের থেকে আলাদা করে আপডেট করতে দেয়। ডায়নামিকালি লোডেড (ডিএল) লাইব্রেরিগুলি দরকারী, তবে তাদের ব্যবহারের জন্য আরও কিছুটা কাজ প্রয়োজন এবং অনেকগুলি প্রোগ্রাম তাদের দেওয়া নমনীয়তার প্রয়োজন হয় না। বিপরীতে, স্ট্যাটিক লাইব্রেরিগুলি গ্রন্থাগারগুলিকে আপগ্রেড করা আরও বেশি সমস্যাযুক্ত করে তোলে, তাই সাধারণ উদ্দেশ্যে ব্যবহারের জন্য তাদের সুপারিশ করা কঠিন। তবুও প্রত্যেকের নিজস্ব সুবিধা রয়েছে এবং প্রতিটি প্রকারের সুবিধাগুলি সেই ধরণের আলোচনা করা বিভাগে বর্ণিত হয়েছে। সি ++ এবং গতিশীল লোডযুক্ত লাইব্রেরিগুলি ব্যবহার করে বিকাশকারীদেরও `` সি ++ ড্লোপেন মিনি-হাওটো '' এর পরামর্শ নেওয়া উচিত।
    এটি লক্ষণীয় যে, কিছু লোক ভাগ করা লাইব্রেরিগুলিকে উল্লেখ করার জন্য ডায়নামিকালি লিঙ্কড লাইব্রেরি (ডিএলএল) শব্দটি ব্যবহার করেন, কেউ ডিএলএল শব্দটি কোনও ডিএল লাইব্রেরি হিসাবে ব্যবহৃত কোনও লাইব্রেরি বোঝাতে ব্যবহার করেন এবং কেউ কেউ লাইব্রেরির মিটিং বলতে ডিএলএল শব্দটি ব্যবহার করেন। শর্ত। আপনি কোন অর্থটি বেছে নিন তা বিবেচ্য নয়, এই হাওটি লিনাক্সের ডিএলএলগুলি কভার করে।
    এই হাওটো এক্সিকিউটেবল এবং লাইব্রেরিগুলির জন্য কেবল এক্সিকিউটেবল এবং লিঙ্কিং ফর্ম্যাট (ইএলএফ) ফর্ম্যাটটি নিয়ে আলোচনা করে, আজ প্রায় সমস্ত লিনাক্স ডিস্ট্রিবিউশন দ্বারা ব্যবহৃত ফর্ম্যাট। জিএনইউ জিসিসি টুলসেটটি আসলে ইএলএফ ব্যতীত গ্রন্থাগার ফর্ম্যাটগুলি পরিচালনা করতে পারে; বিশেষত, বেশিরভাগ লিনাক্স বিতরণগুলি অপ্রচলিত a.out ফর্ম্যাটটি এখনও ব্যবহার করতে পারে। তবে এই ফর্ম্যাটগুলি এই কাগজের সুযোগের বাইরে।
    যদি আপনি এমন একটি অ্যাপ্লিকেশন তৈরি করছেন যা বেশ কয়েকটি সিস্টেমে পোর্ট করা উচিত তবে আপনি সরাসরি লিনাক্স সরঞ্জামগুলি ব্যবহার না করে গ্রন্থাগারগুলি তৈরি ও ইনস্টল করতে GNU libtool ব্যবহার করার কথা বিবেচনা করতে পারেন । জিএনইউ লিবটোল একটি জেনেরিক লাইব্রেরি সমর্থন স্ক্রিপ্ট যা একটি সামঞ্জস্যপূর্ণ, বহনযোগ্য ইন্টারফেসের পিছনে ভাগ করে নেওয়া লাইব্রেরিগুলি (উদাহরণস্বরূপ, তাদের তৈরি এবং ইনস্টল করা) ব্যবহারের জটিলতা লুকায়। লিনাক্সে, এই হাওটোতে বর্ণিত সরঞ্জাম এবং কনভেনশনগুলির শীর্ষে জিএনইউ লিবিটোল নির্মিত হয়। গতিশীলভাবে লোড করা লাইব্রেরিগুলির জন্য পোর্টেবল ইন্টারফেসের জন্য, আপনি বিভিন্ন বহনযোগ্যতা মোড়ক ব্যবহার করতে পারেন। জিএনইউ লিবিটোলে এমন একটি মোড়ক অন্তর্ভুক্ত থাকে, যার নাম `b libltdl ''। বিকল্পভাবে, আপনি গ্লাইব লাইব্রেরিটি (গ্লোবিকের সাথে বিভ্রান্ত হওয়ার প্রয়োজন নেই) এর ডাইনেমিক লোডিং মডিউলগুলির জন্য তার সমর্থনযোগ্য সমর্থন সহ ব্যবহার করতে পারেন। আপনি গ্লিবের মডিউলগুলির গতিশীল লোডিং সম্পর্কে আরও শিখতে পারেন http://library.gnome.org/devel/glib/stable/glib- ডায়নামিক- লোডিং- থেকে- Module.html । আবার লিনাক্সে এই কার্যকারিতাটি এই হাওটোতে বর্ণিত কনস্ট্রাক্ট ব্যবহার করে প্রয়োগ করা হয়। আপনি যদি লিনাক্সে কোডটি বিকাশ বা ডিবাগ করে থাকেন তবে আপনি সম্ভবত এই হাওটোতে তথ্য চাইবেন।
    এই HOWTO এর প্রধান অবস্থান হ'ল http://www.dwheeler.com/program-library/ এবং এটি লিনাক্স ডকুমেন্টেশন প্রজেক্টে ( http://www.linuxdoc.org ) অবদান রেখেছে । এটি কপিরাইট (সি) 2000 ডেভিড এ হুইলারের এবং সাধারণ পাবলিক লাইসেন্সের (জিপিএল) মাধ্যমে লাইসেন্সপ্রাপ্ত; আরও তথ্যের জন্য শেষ বিভাগ দেখুন।

    স্ট্যাটিক লাইব্রেরি

    স্ট্যাটিক লাইব্রেরিগুলি হ'ল সাধারণ বস্তুর ফাইলগুলির সংগ্রহ; প্রচলিতভাবে, স্থির গ্রন্থাগারগুলি `` .a '' প্রত্যয় দিয়ে শেষ হয়। এই সংগ্রহটি আর (আর্কিভার) প্রোগ্রাম ব্যবহার করে তৈরি করা হয়েছে। স্ট্যাটিক লাইব্রেরিগুলি যেমন একবারে হয়েছিল তেমন ব্যবহৃত হয় না, কারণ ভাগ করা লাইব্রেরিগুলির সুবিধার কারণে (নীচে বর্ণিত)। তবুও, এগুলি কখনও কখনও তৈরি করা হয়, তারা historতিহাসিকভাবে প্রথমে বিদ্যমান ছিল এবং তাদের ব্যাখ্যা করা সহজ।
    স্ট্যাটিক লাইব্রেরি ব্যবহারকারীদের পুনরায় সংকলনের সময় সাশ্রয় করে এর কোডটি পুনরায় সংকলন না করেই প্রোগ্রামগুলিতে লিঙ্ক করার অনুমতি দেয়। মনে রাখবেন যে আজকের দ্রুত সংকলকগণকে পুনরায় সংশ্লেষ করার সময়টি কম গুরুত্বপূর্ণ, সুতরাং এই কারণটি এটি আগের মতো শক্তিশালী নয়। স্ট্যাটিক লাইব্রেরিগুলি প্রায়শই বিকাশকারীদের জন্য কার্যকর হয় যদি তারা প্রোগ্রামারদের তাদের লাইব্রেরিতে লিঙ্ক করার অনুমতি দিতে চান তবে লাইব্রেরির উত্স কোডটি দিতে চান না (যা গ্রন্থাগার বিক্রেতার পক্ষে একটি সুবিধা, তবে সম্ভবত প্রোগ্রামারকে চেষ্টা করার চেষ্টা করে কোনও সুবিধা নয়) গ্রন্থাগারটি ব্যবহার করুন)। তত্ত্ব অনুসারে, স্ট্যাটিক ইএলএফ লাইব্রেরিতে কোড যা এক্সিকিউটেবলের সাথে সংযুক্ত থাকে সেগুলি একটি ভাগ করা লাইব্রেরি বা গতিশীল বোঝা লাইব্রেরির তুলনায় কিছুটা দ্রুত (1-5% দ্বারা) চালানো উচিত, তবে বাস্তবে অন্যান্য বিভ্রান্তিকর কারণে এটি খুব কমই দেখা যায় case ।
    একটি স্ট্যাটিক লাইব্রেরি তৈরি করতে, বা বিদ্যমান স্ট্যাটিক লাইব্রেরিতে অতিরিক্ত অবজেক্ট ফাইল যুক্ত করতে, এই জাতীয় কমান্ড ব্যবহার করুন:

    ar rcs my_library.a file1.o file2.o
    
    
    এই স্যাম্পল কমান্ডটি স্থিত লাইব্রেরি my_library.a এ file1.o এবং file2.o অবজেক্ট ফাইল যুক্ত করে, my_library.a তৈরি করে যদি এটি ইতিমধ্যে বিদ্যমান না থাকে। স্ট্যাটিক লাইব্রেরি তৈরির বিষয়ে আরও তথ্যের জন্য, আরদেখুন।
    একবার আপনি একটি স্ট্যাটিক লাইব্রেরি তৈরি করার পরে, আপনি এটি ব্যবহার করতে চাইবেন। আপনি কোনও প্রোগ্রাম কার্যকর করার সময় তৈরির সময় সংকলন এবং লিঙ্কিং প্রক্রিয়ার অংশ হিসাবে এটি স্থির করে একটি স্ট্যাটিক লাইব্রেরি ব্যবহার করতে পারেন। আপনি যদি নিজের এক্সিকিউটেবল জেনারেট করার জন্য জিসিসি (1) ব্যবহার করেন তবে আপনি লাইব্রেরি নির্দিষ্ট করতে -l বিকল্পটি ব্যবহার করতে পারেন; আরও তথ্যের জন্য তথ্য: জিসিসি দেখুন।
    জিসিসি ব্যবহার করার সময় পরামিতিগুলির ক্রম সম্পর্কে সতর্কতা অবলম্বন করুন; -l বিকল্পটি একটি লিঙ্কার বিকল্প, এবং এইভাবে ফাইলের নাম সংকলিত হওয়ার পরে স্থাপন করা দরকার। এটি সাধারণ অপশন সিনট্যাক্স থেকে বেশ আলাদা। আপনি যদি ফাইল-নামের আগে -l বিকল্পটি স্থাপন করেন তবে এটি কোনও লিঙ্ক করতে ব্যর্থ হতে পারে এবং আপনি রহস্যজনক ত্রুটিগুলি দিয়ে শেষ করতে পারেন।
    আপনি লিংক এলডি (1) সরাসরি, এর -l এবং -L বিকল্পগুলি ব্যবহার করেও ব্যবহার করতে পারেন; তবে, বেশিরভাগ ক্ষেত্রে জিডিসি (1) ব্যবহার করা ভাল কারণ এলডি (1) এর ইন্টারফেসটি পরিবর্তিত হওয়ার সম্ভাবনা বেশি।


    ভাগ করা লাইব্রেরিShared Libraries

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

    কনভেনশন

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

    ভাগ করা লাইব্রেরি নাম

    প্রতিটি ভাগ করা লাইব্রেরির special `সোনাম '' নামে একটি বিশেষ নাম রয়েছে। সোনামটির f `lib '' উপসর্গ রয়েছে, গ্রন্থাগারের নাম,` `.so '' বাক্যাংশটি রয়েছে, তারপরে একটি পিরিয়ড এবং সংস্করণ সংখ্যা থাকে যা যখন বাড়ানো হয় তখনই ইন্টারফেস পরিবর্তিত হয় (একটি বিশেষ ব্যতিক্রম হিসাবে, সর্বনিম্ন- স্তরের সি লাইব্রেরিগুলি `b lib '' দিয়ে শুরু হয় না)। সম্পূর্ণরূপে দক্ষ সোনামের মধ্যে এটির ডিরেক্টরিটি একটি উপসর্গ হিসাবে অন্তর্ভুক্ত থাকে; একটি কার্যনির্বাহী সিস্টেমে সম্পূর্ণরূপে যোগ্য সোনামটি কেবল ভাগ করা লাইব্রেরির `` আসল নাম '' এর প্রতীকী লিঙ্ক।
    প্রতিটি ভাগ করা লাইব্রেরির একটি `` আসল নাম '' থাকে, যা প্রকৃত গ্রন্থাগার কোডযুক্ত ফাইলের নাম। আসল নামটি একটি পিরিয়ড, একটি সংখ্যালঘু সংখ্যা, অন্য একটি সময়কালে এবং প্রকাশের নম্বরকে সোনামে যুক্ত করে। শেষ সময়কালে এবং প্রকাশের নম্বরটি areচ্ছিক। লাইব্রেরির কোন সংস্করণ (গুলি) ইনস্টল করা হয়েছে তা ঠিক আপনাকে জানিয়ে মাইনর নম্বর এবং রিলিজ নম্বর সমর্থন কনফিগারেশন নিয়ন্ত্রণ। নোট করুন যে এই সংখ্যাগুলি ডকুমেন্টেশনে লাইব্রেরি বর্ণনা করতে ব্যবহৃত সংখ্যার মতো নাও হতে পারে, যদিও এটি জিনিসগুলিকে সহজ করে তোলে।
    এছাড়াও, লাইব্রেরির অনুরোধ করার সময় সংকলকটি ব্যবহার করে এমন নাম রয়েছে, (আমি এটি the `লিঙ্কারের নাম '' বলব) যা কোনও সংস্করণ নম্বর ছাড়াই সোনাম।
    ভাগ করা লাইব্রেরি পরিচালনার মূল বিষয় হ'ল এই নামগুলি আলাদা করা। প্রোগ্রামগুলি, যখন তারা অভ্যন্তরীণভাবে তাদের ভাগ করা লাইব্রেরিগুলি তালিকাভুক্ত করে, তখন তাদের কেবলমাত্র সোনামের তালিকা দেওয়া উচিত। বিপরীতে, যখন আপনি একটি ভাগ করা লাইব্রেরি তৈরি করেন, আপনি কেবলমাত্র একটি নির্দিষ্ট ফাইল নাম (আরও বিস্তারিত সংস্করণ তথ্য সহ) সহ লাইব্রেরি তৈরি করেন। আপনি যখন কোনও লাইব্রেরির নতুন সংস্করণ ইনস্টল করেন, আপনি এটি কয়েকটি বিশেষ ডিরেক্টরিগুলির মধ্যে একটিতে ইনস্টল করুন এবং তারপরে ldconfig (8) প্রোগ্রামটি চালান। ldconfig বিদ্যমান ফাইলগুলি পরীক্ষা করে এবং প্রকৃত নামগুলির প্রতীকী লিঙ্ক হিসাবে সোনামগুলি তৈরি করে পাশাপাশি ক্যাশে ফাইল /etc/ld.so.cache সেট করে (একটি মুহুর্তে বর্ণিত)।
    ldconfig লিঙ্কারের নামগুলি সেট আপ করে না; সাধারণত এটি গ্রন্থাগার ইনস্টলেশন চলাকালীন করা হয়, এবং লিঙ্কারের নামটি কেবলমাত্র `` সর্বশেষ '' সোনাম বা সর্বশেষ আসল নামের একটি প্রতীকী লিঙ্ক হিসাবে তৈরি করা হয়। আমি লিঙ্কারের নামটি সোনামের সাথে প্রতীকী লিঙ্ক হিসাবে রাখার পরামর্শ দেব, কারণ বেশিরভাগ ক্ষেত্রে আপনি লাইব্রেরি আপডেট করলে আপনি লিঙ্ক করার সময় এটি স্বয়ংক্রিয়ভাবে ব্যবহার করতে চান। আমি এইচজে লুকে জিজ্ঞাসা করেছি কেন এলডকনফিগ স্বয়ংক্রিয়ভাবে লিঙ্কারের নামগুলি সেট আপ করে না। তার ব্যাখ্যাটি মূলত ছিল যে আপনি কোনও লাইব্রেরির সর্বশেষ সংস্করণ ব্যবহার করে কোড চালাতে চান, তবে পরিবর্তে এটি বিকাশ পেতে পারেএকটি পুরানো (সম্ভবত বেমানান) লাইব্রেরির সাথে লিঙ্ক করতে। অতএব, ldconfig আপনি কি প্রোগ্রামগুলিতে লিঙ্ক করতে চান সে সম্পর্কে কোনও অনুমান করে না, সুতরাং লিঙ্কারের জন্য লাইব্রেরির জন্য কী ব্যবহার করবে তা আপডেট করতে ইনস্টলারদের অবশ্যই প্রতীকী লিঙ্কগুলি পরিবর্তন করতে হবে।
    সুতরাং, /usr/lib/libreadline.so.3 সম্পূর্ণরূপে সুনির্দিষ্ট সোনাম, যা ldconfig /usr/lib/libreadline.so.3.0 এর মতো কিছু বাস্তব নামের প্রতীকী লিঙ্ক হিসাবে সেট করবে । এখানে একটা linker নাম, হওয়া উচিত /usr/lib/libreadline.so যা সিম্বলিক লিঙ্ক উল্লেখ করা যেতে পারে /usr/lib/libreadline.so.3 ।

    ফাইল সিস্টেম প্লেসমেন্ট

    ভাগ করা লাইব্রেরিগুলি ফাইল সিস্টেমে কোথাও স্থাপন করা উচিত। বেশিরভাগ ওপেন সোর্স সফ্টওয়্যার জিএনইউ স্ট্যান্ডার্ড অনুসরণ করে; আরও তথ্যের জন্য তথ্যে তথ্য ফাইল ডকুমেন্টেশন দেখুন : মানক # ডিরেক্টরি_ভেরিয়েবল । জিএনইউ স্ট্যান্ডার্ডগুলি সোর্স কোড বিতরণ করার সময় / ইউএসআর / লোকাল / লিবের সমস্ত লাইব্রেরি ডিফল্টরূপে ইনস্টল করার পরামর্শ দেয় (এবং সমস্ত কমান্ডগুলি / usr / স্থানীয় / বিনে যেতে হবে)। তারা এই ডিফল্টগুলি ওভাররাইড করার জন্য এবং ইনস্টলেশন রুটিনগুলি চাওয়ার জন্য কনভেনশনটি সংজ্ঞায়িত করে।
    ফাইল সিস্টেম হায়ারার্কি স্ট্যান্ডার্ড (এফএইচএস) বিতরণে কোথায় যেতে হবে তা আলোচনা করে (দেখুন http://www.pathname.com/fhs )। এফএইচএস অনুসারে, বেশিরভাগ গ্রন্থাগারগুলি / usr / lib এ ইনস্টল করা উচিত, তবে প্রারম্ভের জন্য প্রয়োজনীয় লাইব্রেরিগুলি / lib এবং লাইব্রেরিগুলিতে থাকা উচিত যা সিস্টেমের অংশ নয় / usr / স্থানীয় / lib এ থাকা উচিত।
    এই দুটি নথির মধ্যে সত্যই কোনও বিরোধ নেই; জিএনইউ স্ট্যান্ডার্ডগুলি উত্স কোডের বিকাশকারীদের জন্য ডিফল্টর প্রস্তাব দেয়, যখন এফএইচএস বিতরণকারীদের জন্য ডিফল্টের প্রস্তাব দেয় (যারা সাধারণত সিস্টেমের প্যাকেজ পরিচালনা সিস্টেমের মাধ্যমে উত্স কোড ডিফল্টকে ওভাররাইড করে)। অনুশীলনে এটি দুর্দান্তভাবে কাজ করে: আপনি ডাউনলোড করেছেন এমন `` সর্বশেষ '' (সম্ভবত বগি!) উত্স কোডটি স্বয়ংক্রিয়ভাবে নিজেকে `` স্থানীয় '' ডিরেক্টরিতে ইনস্টল করে ( / usr / স্থানীয়), এবং একবারে কোডটি প্যাকেজটি পরিপক্ক হওয়ার পরে, বিতরণগুলির জন্য কোডটিকে স্ট্যান্ডার্ড জায়গায় রেখে দিতে তুচ্ছভাবে ডিফল্টটিকে ওভাররাইড করতে পারে। মনে রাখবেন যে আপনার লাইব্রেরি যদি এমন প্রোগ্রামগুলিকে কল করে যেগুলি কেবল লাইব্রেরির মাধ্যমে কল করা যায়, আপনার সেই প্রোগ্রামগুলি / usr / স্থানীয় / লিবেক্সে (যা একটি বিতরণে / usr / libexec হয়) স্থাপন করা উচিত। একটি জটিলতা হ'ল রেড হ্যাট থেকে প্রাপ্ত সিস্টেমগুলি তাদের লাইব্রেরির অনুসন্ধানে ডিফল্টরূপে / usr / local / lib অন্তর্ভুক্ত করে না; /etc/ld.so.conf সম্পর্কে নীচে আলোচনা দেখুন। অন্যান্য স্ট্যান্ডার্ড গ্রন্থাগারের অবস্থানগুলিতে এক্স উইন্ডোগুলির জন্য / usr / X11R6 / lib অন্তর্ভুক্ত। নোট করুন / lib / সুরক্ষা পিএএম মডিউলগুলির জন্য ব্যবহৃত হয় তবে সেগুলি সাধারণত ডিএল লাইব্রেরি হিসাবে লোড করা হয় (নীচেও আলোচনা করা হয়েছে)।

    How Libraries are Used লাইব্রেরিগুলি কীভাবে ব্যবহৃত হয়

    সমস্ত লিনাক্স সিস্টেম সহ জিএনইউ গ্লিবসি-ভিত্তিক সিস্টেমগুলিতে, একটি ইএলএফ বাইনারি এক্সিকিউটেবল শুরু করার ফলে প্রোগ্রাম লোডারটি স্বয়ংক্রিয়ভাবে লোড হয়ে যায় এবং চালিত হয়। লিনাক্স সিস্টেমে, এই লোডারটির নাম /lib/ld-linux.so.X (যেখানে এক্স সংস্করণ সংখ্যা) is এই লোডার, ঘুরে, প্রোগ্রাম দ্বারা ব্যবহৃত সমস্ত ভাগ করা লাইব্রেরি সন্ধান এবং লোড করে।
    অনুসন্ধান করা ডিরেক্টরিগুলির তালিকা ফাইল /etc/ld.so.conf- এ সংরক্ষণ করা হয়। অনেকগুলি রেট হ্যাট থেকে প্রাপ্ত ডিস্ট্রিবিউশন সাধারণত /etc/ld.so.conf ফাইলটিতে / usr / স্থানীয় / lib অন্তর্ভুক্ত করে না। আমি এটিকে একটি ত্রুটি হিসাবে বিবেচনা করি এবং / usc / local / lib /etc/ld.so.conf এ যুক্ত করা একটি সাধারণ `` ফিক্স '' যা রেড হ্যাট থেকে প্রাপ্ত সিস্টেমগুলিতে অনেকগুলি প্রোগ্রাম চালানোর প্রয়োজন।
    আপনি যদি কোনও লাইব্রেরিতে কয়েকটি ফাংশন ওভাররাইড করতে চান তবে লাইব্রেরির বাকী অংশটি রাখতে চান, আপনি /etc/ld.so.preload এ ওভাররাইড গ্রন্থাগারগুলির (.o ফাইল) নাম লিখতে পারেন; এই `` প্রিলোডিং '' গ্রন্থাগারগুলি মানক সেটের চেয়ে বেশি অগ্রাধিকার নেবে। এই প্রিলোডিং ফাইলটি সাধারণত জরুরী প্যাচগুলির জন্য ব্যবহৃত হয়; বিতরণ করার সময় সাধারণত এই জাতীয় ফাইল অন্তর্ভুক্ত থাকে না।
    প্রোগ্রাম স্টার্ট-আপ এ সমস্ত ডিরেক্টরি অনুসন্ধান করা চূড়ান্তভাবে অক্ষম হবে, সুতরাং একটি ক্যাশিংয়ের ব্যবস্থা ব্যবহৃত হয়। প্রোগ্রামটি ldconfig (8) ডিফল্টরূপে /etc/ld.so.conf ফাইলটিতে পড়ে, ডায়নামিক লিংক ডিরেক্টরিগুলিতে উপযুক্ত প্রতীকী লিঙ্কগুলি সেট আপ করে (যাতে তারা মানক কনভেনশনগুলি অনুসরণ করবে), এবং তারপরে একটি ক্যাশে লিখবে / ইত্যাদি / ld.so.cache যা তখন অন্যান্য প্রোগ্রামগুলি দ্বারা ব্যবহৃত হয়। এটি গ্রন্থাগারগুলিতে অ্যাক্সেসের গতি বাড়িয়ে তোলে। প্রকৃতপক্ষে হ'ল ldconfig অবশ্যই চালানো উচিত যখনই কোনও ডিএলএল যুক্ত করা হয়, যখন কোনও ডিএলএল সরানো হয়, বা যখন ডিএলএল ডিরেক্টরিগুলির সেট পরিবর্তন হয়; লাইব্রেরি ইনস্টল করার সময় প্যাকেজ পরিচালকদের দ্বারা চালিত ldconfig প্রায়শই একটি পদক্ষেপ। প্রারম্ভকালে, ডায়নামিক লোডার আসলে /etc/ld.so.cache ফাইলটি ব্যবহার করে এবং তারপরে প্রয়োজনীয় লাইব্রেরিগুলি লোড করে।
    যাইহোক, ফ্রিবিএসডি এই ক্যাশের জন্য কিছুটা আলাদা ফাইলের নাম ব্যবহার করে। ফ্রিবিএসডি-তে, ইএলএফ ক্যাশে হল /var/run/ld-elf.so.hints এবং a.out ক্যাশে /var/run/ld.so.hints। এগুলি এখনও ldconfig দ্বারা আপডেট করা হয়েছে (8), সুতরাং অবস্থানের এই পার্থক্যটি কেবল কয়েকটি বহিরাগত পরিস্থিতিতে গুরুত্বপূর্ণ।

    Environment Variables পরিবেশের পরিবর্তনশীল

    বিভিন্ন পরিবেশের ভেরিয়েবলগুলি এই প্রক্রিয়াটিকে নিয়ন্ত্রণ করতে পারে এবং এমন পরিবেশের পরিবর্তনশীল রয়েছে যা আপনাকে এই প্রক্রিয়াটিকে ওভাররাইড করার অনুমতি দেয়।

    LD_LIBRARY_PATH

    আপনি এই নির্দিষ্ট মৃত্যুর জন্য অস্থায়ীভাবে একটি পৃথক গ্রন্থাগার স্থাপন করতে পারেন। লিনাক্সে, এনভায়রনমেন্ট ভেরিয়েবল LD_LIBRARY_PATH হল একটি কোলন-বিচ্ছিন্ন ডিরেক্টরি ডিরেক্টরি যেখানে লাইব্রেরিগুলি প্রথমে ডিরেক্টরিগুলির ডিরেক্টরি সেট করার আগে অনুসন্ধান করা উচিত; একটি নতুন লাইব্রেরি ডিবাগ করার সময় বা বিশেষ উদ্দেশ্যে একটি অমানুষিক লাইব্রেরি ব্যবহার করার সময় এটি দরকারী। এনভায়রনমেন্ট ভেরিয়েবল LD_PRELOAD স্ট্যান্ডার্ড সেটকে ওভাররাইড করে এমন ফাংশনগুলির সাথে ভাগ করা লাইব্রেরিগুলি তালিকাবদ্ধ করে, ঠিক যেমন /etc/ld.so.preload করে। এগুলি লোডার /lib/ld-linux.so দ্বারা প্রয়োগ করা হয়। আমার মনে রাখা উচিত, যখন LD_LIBRARY_PATH অনেকগুলি ইউনিক্স-মতো সিস্টেমে কাজ করে, এটি সমস্ত ক্ষেত্রে কাজ করে না; উদাহরণস্বরূপ, এই কার্যকারিতাটি এইচপি-ইউএক্স এ উপলব্ধ তবে পরিবেশগত পরিবর্তনশীল SHLIB_PATH হিসাবে এবং AIX এ এই কার্যকারিতাটি পরিবর্তনশীল LIBPATH এর মাধ্যমে হয় (একই সিনট্যাক্স সহ, একটি কোলন-বিচ্ছিন্ন তালিকা সহ)।
    LD_LIBRARY_PATH উন্নয়ন এবং পরীক্ষার জন্য কার্যকর, তবে সাধারণভাবে ব্যবহারের জন্য কোনও ইনস্টলেশন প্রক্রিয়া দ্বারা সাধারণত পরিবর্তন করা উচিত নয়; কেন তার ব্যাখ্যার জন্য, দেখুন ডেভিড বারের `` এলডি_লিবিআরএইপিএটিএইচটি কেন খারাপ Bad '' ( http://xahlee.org/UnixResource_dir/_/ldpath.html )। তবে এটি এখনও বিকাশ বা পরীক্ষার জন্য এবং এমন সমস্যাগুলির জন্য কাজ করার জন্য কার্যকর যা অন্যথায় কাজ করা যায় না। আপনি যদি LD_LIBRARY_PATH এনভায়রনমেন্ট ভেরিয়েবল সেট করতে না চান তবে লিনাক্সে আপনি প্রোগ্রাম লোডারকে সরাসরি ডেকে আনতে এবং যুক্তিগুলি পাস করতে পারেন। উদাহরণস্বরূপ, নিম্নলিখিতটি পরিবেশগত পরিবর্তনশীল LD_LIBRARY_PATH এর সামগ্রীর পরিবর্তে প্রদত্ত PATH ব্যবহার করবে এবং প্রদত্ত নির্বাহযোগ্য চালাবে:
    
    
    /lib/ld-linux.so.2 --library-path PATH EXECUTABLE
    যুক্তি ছাড়াই কেবল ld-linux.so চালানো আপনাকে এটি ব্যবহারে আরও সহায়তা দেবে, তবে আবার এটিকে সাধারণ ব্যবহারের জন্য ব্যবহার করবেন না - এগুলি সবই ডিবাগিংয়ের উদ্দেশ্যে।

    LD_DEBUG

    জিএনইউ সি লোডারে আর একটি দরকারী পরিবেশ পরিবর্তনশীল হ'ল এলডি_ডিইউবিজি। এটি ডিএল * ফাংশনগুলিকে ট্রিগার করে যাতে তারা কী করছে সে সম্পর্কে যথেষ্ট ভার্জোজ তথ্য দেয়। উদাহরণ স্বরূপ:
      
      export LD_DEBUG=files
      command_to_run
    লাইব্রেরি পরিচালনা করার সময় ফাইল এবং গ্রন্থাগারগুলির প্রসেসিং প্রদর্শিত হয়, আপনাকে কী নির্ভরতা সনাক্ত করা হয় এবং কোন SO গুলি কোন ক্রমে লোড করা হয় তা জানিয়ে দেয়। LD_DEBUG to ``bindings'''' সেট করা প্রতীক বাঁধন সম্পর্কিত তথ্য প্রদর্শন করে` `libs '' এ সেট করে গ্রন্থাগারের অনুসন্ধানের পথগুলি প্রদর্শন করে এবং it` ``versions'' সংস্করণে 'সেট করে রাখলে সংস্করণ নির্ভরতা প্রদর্শন করে।

    LD_DEBUG কে `` সহায়তা '' তে সেট করা এবং তারপরে একটি প্রোগ্রাম চালানোর চেষ্টা করা সম্ভাব্য বিকল্পগুলির তালিকা তৈরি করবে। আবার, LD_DEBUG সাধারণ ব্যবহারের উদ্দেশ্যে নয়, তবে এটি ডিবাগিং এবং পরীক্ষার সময় কার্যকর হতে পারে।

    Other Environment Variables অন্যান্য পরিবেশ পরিবর্তনশীল

    বাস্তবে এমন অনেকগুলি পরিবেশের পরিবর্তনশীল রয়েছে যা লোডিং প্রক্রিয়াটি নিয়ন্ত্রণ করে; তাদের নামগুলি  LD_ or RTLD_ দিয়ে শুরু হয়। অন্যদের বেশিরভাগ লোডার প্রক্রিয়াটির নিম্ন-স্তরের ডিবাগিং বা বিশেষ ক্ষমতা প্রয়োগের জন্য capabilities তাদের বেশিরভাগই সঠিকভাবে নথিভুক্ত নয়; যদি তাদের সম্পর্কে আপনার জানা দরকার, তাদের সম্পর্কে জানার সর্বোত্তম উপায় হ'ল লোডারটির উত্স কোড ((part of gcc).) পড়া।
    বিশেষ ব্যবস্থা না নেওয়া হলে গতিশীলভাবে সংযুক্ত গ্রন্থাগারগুলিতে ব্যবহারকারীর নিয়ন্ত্রণের অনুমতি দেওয়া বিপর্যয়কর হবে setuid/setgid  সুতরাং, জিএনইউ লোডারে (GNU loader (which loads the rest of the program on program start-up)  যদি প্রোগ্রামটি সেটআপ হয় বা এই ভেরিয়েবলগুলি সেট করা হয় (এবং অন্যান্য অনুরূপ ভেরিয়েবলগুলি) তারা কী করতে পারে তা উপেক্ষা করা হয় বা ব্যাপকভাবে সীমিত করা হয়। প্রোগ্রামার শংসাপত্রগুলি পরীক্ষা করে কোনও প্রোগ্রাম সেটআপড বা সেটগিড কিনা তা লোডার নির্ধারণ করে; যদি uid and euid differ পৃথক হয়, বা gid and the egid differ, পৃথক হয়, লোডার অনুমান করে যে প্রোগ্রামটি setuid/setgid (or descended from one)  (বা একের কাছ থেকে অবতরণ হয়েছে) এবং অতএব লিঙ্কিং নিয়ন্ত্রণের জন্য এর ক্ষমতাগুলি ব্যাপকভাবে সীমাবদ্ধ করে। আপনি যদি GNU glibc library source code  পড়েন তবে আপনি এটি দেখতে পারেন; বিশেষত ফাইলগুলি  elf/rtld.c and sysdeps/generic/dl-sysdep.c.  দেখুন। এর অর্থ হ'ল আপনি যদিuid and gid to equal the euid and egid, and then call a program, সমান করতে এবং তারপরে একটি প্রোগ্রাম কল করেন তবে এই ভেরিয়েবলগুলির সম্পূর্ণ প্রভাব থাকবে। অন্যান্য Unix-like মতো সিস্টেম পরিস্থিতিটি ভিন্নভাবে পরিচালনা করে তবে একই কারণে: একটি setuid/setgid  প্রোগ্রামটি পরিবেশের ভেরিয়েবল সেট দ্বারা অযথা প্রভাবিত হওয়া উচিত নয়।

    Creating a Shared Library একটি শেয়ার্ড লাইব্রেরি তৈরি করা হচ্ছে

    ভাগ করা লাইব্রেরি তৈরি করা সহজ। প্রথমে, অবজেক্ট ফাইলগুলি তৈরি করুন যাgcc -fPIC or -fpic flag  ব্যবহার করে ভাগ করা লাইব্রেরিতে যাবে।  -fPIC and -fpic  বিকল্পগুলি  অবস্থানের স্বাধীন কোড '' জেনারেশন সক্ষম করে, ভাগ করা লাইব্রেরির জন্য প্রয়োজনীয়তা; পার্থক্যগুলির জন্য নীচে দেখুন। আপনি -Wl gcc বিকল্পটি ব্যবহার করে সোনামটি পাস করেন। -ডাব্লুএলএল বিকল্পটি লিঙ্কারের পাশাপাশি বিকল্পগুলি পাস করে (এক্ষেত্রে -সোনাম লিংকার বিকল্প)-Wl gcc option  এর পরে কমাগুলি  -Wl কোনও টাইপ নয়, এবং আপনাকে বিকল্পটিতে অপরিবর্তিত হোয়াইটস্পেস অন্তর্ভুক্ত করতে হবে না। তারপরে এই বিন্যাসটি ব্যবহার করে ভাগ করা লাইব্রেরি তৈরি করুন:

    gcc -shared -Wl,-soname,your_soname \
    -o library_namefile_listlibrary_list

    এখানে একটি উদাহরণ দেওয়া আছে, যা দুটি অবজেক্ট ফাইল তৈরি করে (a.o and b.o)  এবং তারপরে একটি ভাগ করে নেওয়া লাইব্রেরি তৈরি করে যার মধ্যে দুটি রয়েছে। নোট করুন যে এই সংকলনে ডিবাগিং তথ্য ((-g)) অন্তর্ভুক্ত রয়েছে এবং সতর্কতা তৈরি করা হবে (-Wall), যা ভাগ করে নেওয়া লাইব্রেরির জন্য প্রয়োজনীয় নয় তবে প্রস্তাবিত হয়। সংকলনটি অবজেক্ট ফাইল তৈরি করে (-c ব্যবহার করে) এবং এতে প্রয়োজনীয়  -fPIC বিকল্প অন্তর্ভুক্ত থাকে। দ্রষ্টব্য: GCC 4.5 ম্যানুয়ালটিতে বলা হয়েছে যে আপনি যদি ভাগ-ভাগ করা ব্যবহার করেন তবে "ভবিষ্যদ্বাণীমূলক ফলাফলের জন্য আপনাকে কোডগুলি (-fpic, -fPIC, or model suboptions ) তৈরি করতে ব্যবহৃত বিকল্পগুলির একই সেটটিও নির্দিষ্ট করতে হবে"। মূল সংকলনের সময়, লিঙ্ক করার সময় আপনার -fPIC অন্তর্ভুক্ত করা উচিত। [1]

    এখানে কয়েকটি বিষয় লক্ষণীয়:

    • ফলস্বরূপ গ্রন্থাগারটি সজ্জিত করবেন না এবং সংকলক বিকল্প -ফমিত-ফ্রেম-পয়েন্টার ব্যবহার করবেন না যদি না আপনি সত্যিই না চান। ফলে প্রাপ্ত গ্রন্থাগারটি কাজ করবে তবে এই ক্রিয়াগুলি ডিবাগারগুলিকে বেশিরভাগ অকেজো করে তোলে।
    • কোড উত্পন্ন করতে Use -fPIC or -fpic to generate code. ব্যবহার করুন। কোড উত্পন্ন করতে -fPIC বা -fpic ব্যবহার করবেন কিনা তা লক্ষ্য-নির্ভর। -ফপিক পছন্দটি সর্বদা কাজ করে তবে -ফপিকের চেয়ে বৃহত্তর কোড তৈরি করতে পারে (এটি স্মরণ করার জন্য স্ত্রীরোগটি হ'ল পিআইসি একটি বৃহত্তর ক্ষেত্রে রয়েছে, সুতরাং এটি বৃহত্তর পরিমাণে কোড উত্পন্ন করতে পারে)। -Fpic বিকল্পটি ব্যবহার করা সাধারণত ছোট এবং দ্রুত কোড উত্পন্ন করে তবে প্ল্যাটফর্ম নির্ভর সীমাবদ্ধতা থাকবে যেমন বিশ্বব্যাপী দৃশ্যমান চিহ্নগুলির সংখ্যা বা কোডের আকার। লিঙ্কারটি আপনাকে বলবে আপনি যখন ভাগ করা লাইব্রেরি তৈরি করবেন তখন এটি মানানসই কিনা। সন্দেহ হলে আমি -fPIC নির্বাচন করি, কারণ এটি সর্বদা কার্যকর হয়।
    • In some cases, the call to gcc to create the object file will also need to include the option ``-Wl,-export-dynamic''.  অন্তর্ভুক্ত করতে হবে। সাধারণত, গতিশীল প্রতীক টেবিলটিতে কেবলমাত্র চিহ্ন থাকে যা একটি গতিশীল অবজেক্ট দ্বারা ব্যবহৃত হয়। এই বিকল্পটি (কোনও ইএলএফ ফাইল তৈরি করার সময়) গতিশীল প্রতীক টেবিলে সমস্ত চিহ্ন যুক্ত করে (আরও তথ্যের জন্য এলডি (1) দেখুন)। 'বিপরীত নির্ভরতা' থাকাকালীন আপনাকে এই বিকল্পটি ব্যবহার করতে হবে, অর্থাত্ একটি ডিএল লাইব্রেরিতে অমীমাংসিত চিহ্ন রয়েছে যা এই লাইব্রেরিগুলি লোড করার উদ্দেশ্যে প্রোগ্রামগুলিতে কনভেনশন দ্বারা সংজ্ঞায়িত করা উচিত। To verse বিপরীত নির্ভরতা '' কাজ করার জন্য, মাস্টার প্রোগ্রামটি অবশ্যই তার প্রতীকগুলি গতিশীলভাবে উপলভ্য করতে হবে। নোট করুন যে আপনি যদি কেবল লিনাক্স সিস্টেমের সাথে কাজ করেন তবে L rd -rdynamic '' ফ্ল্যাগ ডোন '' হিসাবে আপনি `rd -Wl, এক্সপোর্ট-ডায়নামিক '' এর পরিবর্তে say rd -ynar '' বলতে পারেন

    বিকাশের সময়, একটি লাইব্রেরি সংশোধন করার সম্ভাব্য সমস্যা রয়েছে যা অন্যান্য অনেক প্রোগ্রামও ব্যবহার করে - এবং আপনি অন্যান্য প্রোগ্রামগুলিকে 'উন্নয়নমূলক' লাইব্রেরি ব্যবহার করতে চান না, কেবলমাত্র একটি নির্দিষ্ট অ্যাপ্লিকেশন যা আপনি এর বিপরীতে পরীক্ষা করছেন । আপনি যে লিঙ্ক বিকল্পটি ব্যবহার করতে পারেন তা হ'ল ld এর `p rpath '' বিকল্পটি, যা নির্দিষ্ট প্রোগ্রামের সংকলিত হওয়ার রানটাইম লাইব্রেরি অনুসন্ধানের পথটি নির্দিষ্ট করে। জিসিসি থেকে, আপনি এইভাবে নির্দিষ্ট করে আরপিথ বিকল্পটি আবেদন করতে পারেন:
     -Wl, -rpath, $ (DEFAULT_LIB_INSTALL_PATH)
    আপনি যদি লাইব্রেরি ক্লায়েন্ট প্রোগ্রাম তৈরি করার সময় এই বিকল্পটি ব্যবহার করেন তবে এটি বিরোধী নয় বা লাইব্রেরিটি আড়াল করার জন্য অন্যান্য কৌশলগুলি ব্যবহার করে তা নিশ্চিত করার পরিবর্তে আপনার LD_LIBRARY_PATH (পরবর্তী বর্ণিত) নিয়ে বিরক্ত করার দরকার নেই।

    Installing and Using a Shared Library একটি ভাগ করা লাইব্রেরি ইনস্টল করা এবং ব্যবহার করা

    একবার আপনি একটি ভাগ করা লাইব্রেরি তৈরি করার পরে, আপনি এটি ইনস্টল করতে চাইবেন। সহজ পদ্ধতিটি হ'ল লাইব্রেরিটিকে স্ট্যান্ডার্ড ডিরেক্টরিগুলির একটিতে অনুলিপি করা (যেমন, /usr/lib) and run ldconfig )  (8) চালানো।
    প্রথমত, আপনাকে কোথাও ভাগ করে নেওয়া লাইব্রেরি তৈরি করতে হবে। তারপরে, আপনাকে প্রয়োজনীয় প্রতীকী লিঙ্কগুলি সেটআপ করতে হবে, বিশেষত একটি সোনাম থেকে আসল নামের একটি লিঙ্ক (as well as from a versionless soname, that is, a soname that ends in ``.so'' for users who don't specify a version at all). The simplest approach is to run:  সহজ পদ্ধতির চালানো হয়:

     ldconfig -n directory_with_shared_libraries



    অবশেষে, আপনি যখন আপনার প্রোগ্রামগুলি compile সংকলন করবেন, আপনাকে লিঙ্কারকে কোনও স্ট্যাটিক এবং ভাগ করা লাইব্রেরি সম্পর্কে ব্যবহার করতে হবে যা আপনি ব্যবহার করছেন tell এর জন্য  -l and -L   বিকল্পগুলি ব্যবহার করুন।
    আপনি যদি কোনও স্ট্যান্ডার্ড স্থানে লাইব্রেরি ইনস্টল করতে না চান বা না চান (যেমন, you don't have the right to modify /usr/lib সংশোধন করার অধিকার নেই), তবে আপনাকে আপনার পদ্ধতির পরিবর্তন করতে হবে। সেক্ষেত্রে আপনাকে এটি অন্য কোথাও ইনস্টল করতে হবে এবং তারপরে আপনার প্রোগ্রামকে পর্যাপ্ত তথ্য প্রদান করা উচিত যাতে প্রোগ্রামটি লাইব্রেরিটি খুঁজে পেতে পারে ... এবং এটি করার বিভিন্ন উপায় রয়েছে। আপনি সাধারণ ক্ষেত্রে gcc's -L flag in simple cases ব্যবহার করতে পারেন। আপনি `` `rpath আরপাথ '' পদ্ধতিটি (উপরে বর্ণিত) ব্যবহার করতে পারেন, বিশেষত যদি আপনার `` non-standard  '' জায়গায় স্থাপন করা লাইব্রেরিটি ব্যবহার করার জন্য নির্দিষ্ট প্রোগ্রাম থাকে। আপনি জিনিসগুলি নিয়ন্ত্রণ করতে পরিবেশের ভেরিয়েবলগুলিও ব্যবহার করতে পারেন। বিশেষত, আপনি LD_LIBRARY_PATH সেট করতে পারেন যা সাধারণ জায়গাগুলির আগে ভাগ করা লাইব্রেরিগুলি অনুসন্ধান করার জন্য ডিরেক্টরিগুলির একটি colon-separated list তালিকা।If you're using bash  ব্যবহার করছেন তবে আপনি my_program টি এভাবে ব্যবহার করতে পারেন:

    LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH  my_program


    আপনি যদি কয়েকটি নির্বাচিত ফাংশন ওভাররাইড করতে চান, আপনি একটি ওভাররাইডিং অবজেক্ট ফাইল তৈরি করে এবং LD_PRELOAD সেট করে এটি করতে পারেন; এই অবজেক্ট ফাইলে ফাংশনগুলি কেবল সেই ফাংশনগুলিকে ওভাররাইড করবে (অন্য  যেমন ছিল তেমন রেখে দেওয়া)।
    সাধারণত আপনি উদ্বেগ ছাড়াই লাইব্রেরি আপডেট করতে পারেন; যদি কোনও API এআইপি পরিবর্তন হয়, গ্রন্থাগার স্রষ্টার soname পরিবর্তন করার কথা। এইভাবে, একাধিক গ্রন্থাগার একক সিস্টেমে থাকতে পারে এবং প্রতিটি প্রোগ্রামের জন্য ডানটি বেছে নেওয়া হয়। যাইহোক, যদি কোনও প্রোগ্রাম একই সোনামটি রাখে এমন কোনও লাইব্রেরির আপডেটে ব্রেক হয়ে যায় তবে আপনি প্রোগ্রামটির নাম পরিবর্তন করে পুরোনো লাইব্রেরিটি আবার কোথাও অনুলিপি করে পুরানো গ্রন্থাগার সংস্করণটি ব্যবহার করতে বাধ্য করতে পারেন (পুরানো নামটি প্লাস `` .orig বলুন ''), এবং তারপরে একটি ছোট `` র‍্যাপার '' স্ক্রিপ্ট তৈরি করুন যা লাইব্রেরিটি ব্যবহার করতে পুনরায় সেট করে এবং আসল (নাম পরিবর্তন) প্রোগ্রামটি কল করে। আপনি যদি পছন্দ করেন তবে আপনি পুরানো গ্রন্থাগারটি তার নিজস্ব বিশেষ জায়গায় রাখতে পারেন, যদিও সংখ্যার কনভেনশনগুলি একই ডিরেক্টরিতে একাধিক সংস্করণে বাস করার অনুমতি দেয়। মোড়ক স্ক্রিপ্টটি এর মতো দেখতে পারে:


      #!/bin/sh
      export LD_LIBRARY_PATH=/usr/local/my_lib:$LD_LIBRARY_PATH
      exec /usr/bin/my_program.orig $*


    আপনি নিজের প্রোগ্রাম লিখতে দয়া করে এটির উপর নির্ভর করবেন না; আপনার লাইব্রেরিগুলি পিছনের দিকে সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করার চেষ্টা করুন বা আপনি যতবার অসম্পূর্ণ পরিবর্তন করবেন আপনি সোনমের সংস্করণ নম্বরটি বাড়িয়েছেন সবচেয়ে খারাপ সমস্যা মোকাবেলার জন্য এটি কেবলমাত্র একটি 'জরুরি' 'পদ্ধতি approach -করে । 


    আপনি ldd(1)  ব্যবহার করে কোনও প্রোগ্রাম দ্বারা ভাগ করা লাইব্রেরিগুলির তালিকা দেখতে পারেন। সুতরাং, উদাহরণস্বরূপ, আপনি টাইপ করে by ls by  দ্বারা ব্যবহৃত ভাগ করা লাইব্রেরি দেখতে পাবেন:

      ldd /bin/ls

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

    • /lib/ld-linux.so.N (যেখানে N 1 বা আরও বেশি হয়, সাধারণত কমপক্ষে 2)। এটি লাইব্রেরি যা অন্য সমস্ত লাইব্রেরি লোড করে।
    • libc.so.N (যেখানে এন 6 বা আরও বেশি) এটি C  লাইব্রেরি। এমনকি অন্যান্য ভাষাগুলিতেও সি লাইব্রেরি ব্যবহার করার ঝোঁক রয়েছে (কমপক্ষে তাদের নিজস্ব লাইব্রেরি বাস্তবায়নের জন্য), তাই বেশিরভাগ প্রোগ্রামে অন্তত এটি অন্তর্ভুক্ত করে।
    সতর্ক থাকুন: না না একটি প্রোগ্রাম আপনি বিশ্বাস করেন না উপর ldd চালানো। যেমনটি এলডিডি (১) ম্যানুয়ালটিতে স্পষ্টভাবে বলা হয়েছে, এলডিডি একটি বিশেষ পরিবেশের পরিবর্তনশীল (ইএলএফ অবজেক্টের জন্য, LD_TRACE_LOADED_OBJECTS) সেট করে এবং তারপরে প্রোগ্রামটি সম্পাদন করে (নির্দিষ্ট ক্ষেত্রে) দ্বারা কাজ করে। কোনও untrusted অবিশ্বস্ত প্রোগ্রামের জন্য এলডিডি ব্যবহারকারীকে স্বেচ্ছাসেবক কোড চালাতে বাধ্য করা (কেবলমাত্র এলডিডি তথ্য প্রদর্শন করার পরিবর্তে) সম্ভব হতে পারে। সুতরাং, সুরক্ষার স্বার্থে, এমন প্রোগ্রামগুলিতে ldd ব্যবহার করবেন না যেগুলি চালানোর জন্য আপনি বিশ্বাস করেন না।


    Incompatible Libraries বেমানান লাইব্রেরি গুলি 

    কোনও লাইব্রেরির নতুন সংস্করণটি পুরনোটির সাথে বাইনারি-বেমানান থাকলে সোনামটি পরিবর্তন করা দরকার। C-তে, চারটি মূল কারণ রয়েছে যে একটি লাইব্রেরি বাইনারি সামঞ্জস্যপূর্ণ হওয়া বন্ধ করবে:

    1. কোনও ক্রিয়াকলাপের আচরণ এমন পরিবর্তিত হয় যে এটি আর তার মূল স্পেসিফিকেশনটির সাথে মেলে না,
    2. Exported data রফতানি তথ্য আইটেম পরিবর্তন (ব্যতিক্রম: কাঠামোর শেষ প্রান্তে alচ্ছিক আইটেম যোগ করা ঠিক আছে, যতক্ষণ না সেই কাঠামোগুলি কেবল গ্রন্থাগারের মধ্যে বরাদ্দ থাকে)।exception: adding optional items to the ends of structures is okay, as long as those structures are only allocated within the library 
    3. একটি রফতানি করা ফাংশন সরানো হয়েছে।
    4. রফতানি ফাংশনের ইন্টারফেস পরিবর্তিত হয়।

    আপনি যদি এই কারণগুলি এড়াতে পারেন তবে আপনি আপনার লাইব্রেরিগুলিকে বাইনারি-সামঞ্জস্যপূর্ণ রাখতে পারেন। অন্যভাবে বলেছিলেন, আপনি যদি এই ধরনের পরিবর্তনগুলি এড়িয়ে যান তবে আপনি আপনার অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (এবিআই) সামঞ্জস্য রাখতে পারেন। উদাহরণস্বরূপ, আপনি নতুন ফাংশন যুক্ত করতে চান তবে পুরানোগুলি মুছবেন না। আপনি কাঠামোগুলিতে আইটেমগুলি যুক্ত করতে পারেন তবে কেবলমাত্র যদি আপনি নিশ্চিত করতে পারেন যে কেবল কাঠামোর শেষে আইটেম যুক্ত করে পুরানো প্রোগ্রামগুলি এই ধরনের পরিবর্তনের প্রতি সংবেদনশীল হবে না, কেবল গ্রন্থাগারকে (এবং অ্যাপ্লিকেশনটি নয়) কাঠামো বরাদ্দ করার অনুমতি দেয়, অতিরিক্ত আইটেমগুলি অচ্ছিক করা (বা লাইব্রেরিটি সেগুলিতে পূরণ করা) ইত্যাদি and সতর্কতা অবলম্বন করুন - যদি ব্যবহারকারীরা অ্যারে ব্যবহার করে তবে আপনি সম্ভবত কাঠামোগুলি প্রসারিত করতে পারবেন না। 
    সি ++ (এবং অন্যান্য ভাষাগুলি সংকলিত টেম্পলেট এবং / অথবা সংকলিত প্রেরণ পদ্ধতিগুলি সমর্থন করে) এর জন্য পরিস্থিতি আরও জটিল। উপরের সমস্ত ইস্যু প্রয়োগ করে আরও অনেকগুলি ইস্যু। কারণটি হ'ল কিছু তথ্য সংকলিত কোডে covers। কভারের আওতায় '' প্রয়োগ করা হয়, যার ফলে নির্ভরশীলতাগুলি সুস্পষ্ট নাও হতে পারে যদি আপনি না জানেন যে C ++ সাধারণত কীভাবে প্রয়োগ করা হয়। কড়া কথায় বলতে গেলে এগুলি `` নতুন '' সমস্যা নয়, এটি কেবল সংকলিত সি ++ কোড তাদের এমনভাবে উপস্থাপন করে যা আপনার জন্য অবাক হতে পারে। নীচে আপনি সি ++ তে যা করতে এবং করতে পারবেন না এমনগুলিগুলির (সম্ভবত অসম্পূর্ণ) তালিকা রয়েছে এবং বাইনারি সামঞ্জস্যতা বজায় রাখতে পারেন (এগুলি মূলত ট্রল টেকের টেকনিক্যাল এফএকিউ দ্বারা প্রকাশিত হয়েছিল; আরও একটি আপ-টু-ডেট তালিকা কে- KDE's Policies/Binary Compatibility Issues With C++):

      1. ভার্চুয়াল ফাংশনগুলির পুনরায় সংযোজন যুক্ত করুন (যদি না এটি পুরানো বাইনারিগুলির পক্ষে মূল বাস্তবায়ন কল করা নিরাপদ না হয়), কারণ সংকলক সুপারক্লাস :: ভার্চুয়াল ফাংশন () সংকলন-সময়ে কলগুলি (লিঙ্ক-টাইম নয়) মূল্যায়ন করে।
      2. ভার্চুয়াল সদস্য ফাংশন যুক্ত বা সরিয়ে ফেলুন, কারণ এটি প্রতিটি উপক্লাসের ভিটিবিএলের আকার এবং বিন্যাসকে পরিবর্তন করবে।
      3. যে কোনও ডেটা সদস্যের ধরণ পরিবর্তন করুন বা ইনলাইন সদস্য ফাংশনগুলির মাধ্যমে অ্যাক্সেস করা যায় এমন কোনও ডেটা সদস্যকে সরান।
      4. নতুন পাতাগুলি যুক্ত বাদে শ্রেণি শ্রেণিবিন্যাস পরিবর্তন করুন।
      5. ব্যক্তিগত ডেটা সদস্যদের যুক্ত বা সরিয়ে ফেলুন, কারণ এটি প্রতিটি উপক্লাসের আকার এবং বিন্যাস পরিবর্তন করবে।
      6. পাবলিক বা সুরক্ষিত সদস্য ফাংশনগুলি যদি তারা ইনলাইন না করে তবে অপসারণ করুন।
      7. একটি সর্বজনীন বা সুরক্ষিত সদস্য ফাংশন ইনলাইন করুন।
      8. পুরানো সংস্করণ কাজ না করা অবধি কোনও ইনলাইন ফাংশন কী করে তা পরিবর্তন করুন।
      9. পোর্টেবল প্রোগ্রামে সদস্য ফাংশনের অ্যাক্সেস রাইটগুলি (যেমন পাবলিক, সুরক্ষিত বা প্রাইভেট) পরিবর্তন করুন, কারণ কিছু সংকলক ফাংশনের নামে অ্যাক্সেসের অধিকারগুলিকে ম্যাঙ্গেল করে।
      এই দীর্ঘ তালিকাটি দেওয়া হয়েছে, বিশেষত সি ++ গ্রন্থাগারগুলির বিকাশকারীদের বাইনারি সামঞ্জস্যতা ভঙ্গকারী মাঝে মাঝে আপডেটের চেয়ে বেশি পরিকল্পনা করতে হবে। ভাগ্যক্রমে, ইউনিক্সের মতো সিস্টেমে (লিনাক্স সহ) আপনি একই সাথে একটি লাইব্রেরির একাধিক সংস্করণ লোড করতে পারেন, তাই কিছু ডিস্কের স্থান নষ্ট হওয়ার পরেও ব্যবহারকারীরা পুরানো লাইব্রেরিগুলির জন্য প্রয়োজনীয় `` পুরানো '' প্রোগ্রাম চালাতে পারেন।

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

    নোট

    [1]এটিকে নির্দেশ করার জন্য ব্রিটন কেরিনকে আমার ধন্যবাদ!

  • 0 comments:

    Post a Comment

    New Research

    Attention Mechanism Based Multi Feature Fusion Forest for Hyperspectral Image Classification.

    CBS-GAN: A Band Selection Based Generative Adversarial Net for Hyperspectral Sample Generation.

    Multi-feature Fusion based Deep Forest for Hyperspectral Image Classification.

    ADDRESS

    388 Lumo Rd, Hongshan, Wuhan, Hubei, China

    EMAIL

    contact-m.zamanb@yahoo.com
    mostofa.zaman@cug.edu.cn

    TELEPHONE

    #
    #

    MOBILE

    +8615527370302,
    +8807171546477