.O এবং .dlib এর মধ্যে কী কী পার্থক্য রয়েছে?


214

.dlib হ'ল ওএসএক্সের ডায়নামিক লাইব্রেরি এক্সটেনশন, তবে কখনই আমি toতিহ্যবাহী ইউনিক্স। / ভাগ করে নেওয়া অবজেক্টটি ব্যবহার করতে পারি না / তা কখনই আমার কাছে স্পষ্ট হয় না।

আমার কাছে কিছু প্রশ্ন রয়েছে:

  • একটি ধারণাগত স্তরে, .so এবং .dlib এর মধ্যে প্রধান পার্থক্যগুলি কী?
  • কখন / আমি অন্য এক ব্যবহার করতে পারি?
  • সংকলনের কৌশল এবং টিপস (উদাহরণস্বরূপ, জিসিসি-শেয়ার্ড-এফপিআইসির প্রতিস্থাপন, যেহেতু এটি অক্সে কাজ করে না)

উত্তর:


206

এক্সিকিউটেবল এবং গ্রন্থাগারগুলির জন্য ম্যাক ওএস এক্স দ্বারা ব্যবহৃত ম্যাচ-ও অবজেক্ট ফাইল ফর্ম্যাটটি ভাগ করা লাইব্রেরি এবং গতিশীল লোড হওয়া মডিউলগুলির মধ্যে পার্থক্য করে । otool -hv some_fileএর ফাইল টাইপ দেখতে ব্যবহার করুন some_file

মাচ-ও ভাগ করা লাইব্রেরিতে ফাইল টাইপ থাকে MH_DYLIBএবং এক্সটেনশনটি বহন করে .dlib। এগুলি সাধারণ স্ট্যাটিক লিঙ্কার পতাকাগুলির সাথে লিঙ্ক করা যেতে পারে, যেমন -lfoolibfoo.dylib এর জন্য। সংকলকটিতে -dynamiclibপতাকাটি পাঠিয়ে এগুলি তৈরি করা যেতে পারে । ( -fPICএটি ডিফল্ট এবং নির্দিষ্ট করার দরকার নেই))

লোডযোগ্য মডিউলগুলিকে মাচ-ও স্পিকারে "বান্ডিল" বলা হয়। তাদের ফাইল টাইপ আছে MH_BUNDLE। তারা যে কোনও এক্সটেনশন বহন করতে পারে; .bundleঅ্যাপল দ্বারা এক্সটেনশানটির প্রস্তাব দেওয়া হয়েছে, তবে বেশিরভাগ পোর্ট করা সফ্টওয়্যার .soসামঞ্জস্যের জন্য ব্যবহার করে । সাধারণত, আপনি প্লাগ-ইনগুলির জন্য বান্ডিলগুলি ব্যবহার করবেন যা কোনও অ্যাপ্লিকেশন প্রসারিত করে; এই পরিস্থিতিতে, বান্ডেল অ্যাপ্লিকেশনটির রফতানি হওয়া API এ অ্যাক্সেস পেতে অ্যাপ্লিকেশন বাইনারিটির সাথে লিঙ্ক করবে। সংকলকটিতে -bundleপতাকাটি পাঠিয়ে এগুলি তৈরি করা যেতে পারে ।

ডায়ালিব এবং বান্ডিল উভয়ই dlএপিআই (যেমন dlopen, dlclose) ব্যবহার করে গতিশীল লোড করা যায় । বান্ডিলগুলির সাথে লিঙ্ক করা সম্ভব নয় যেমন সেগুলি লাইব্রেরি ভাগ করা হয়েছে। যাইহোক, এটি সম্ভব যে একটি বান্ডিল বাস্তব ভাগ করা লাইব্রেরির সাথে যুক্ত; সেগুলি স্বয়ংক্রিয়ভাবে লোড হবে যখন বান্ডিলটি লোড হবে।

.তিহাসিকভাবে, পার্থক্যগুলি আরও তাত্পর্যপূর্ণ ছিল। ম্যাক ওএস এক্স 10.0-এ, লাইব্রেরিগুলি গতিশীলভাবে লোড করার কোনও উপায় ছিল না। Dyld API গুলি একটি সেট (যেমন NSCreateObjectFileImageFromFile, NSLinkModule) লোড এবং আন থোকায় থোকায় থেকে 10.1 সঙ্গে চালু হয়, কিন্তু তারা dylibs জন্য কাজ করে নি। dlopen10.3.3 এ বান্ডিলগুলির সাথে কাজ করে এমন একটি সামঞ্জস্য লাইব্রেরি যুক্ত হয়েছিল; 10.4-এ, dlopenডিল্ডের আদি অংশ হিসাবে পুনরায় লেখা হয়েছিল এবং ডাইলিবগুলি লোড করার জন্য সমর্থন যোগ করা হয়েছিল (তবে আনলোডিং নয়)। অবশেষে, 10.5 dlcloseডাইলিবগুলি ব্যবহার করার জন্য সমর্থন যুক্ত করেছে এবং ডিল্ড এপিআইগুলিকে অবমূল্যায়ন করেছে।

লিনাক্সের মতো ইএলএফ সিস্টেমে উভয়ই একই ফাইল ফর্ম্যাট ব্যবহার করে ; ভাগ করা কোডের যে কোনও অংশ লাইব্রেরি হিসাবে এবং গতিশীল লোডিংয়ের জন্য ব্যবহার করা যেতে পারে।

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

অতিরিক্ত রেফারেন্স:


1
এই বিস্তৃত মন্তব্যের জন্য আপনাকে ধন্যবাদ :) আমি কি এটি সঠিকভাবে বুঝতে পারি, যদি আমি অন্য বান্ডেল থেকে একটি বান্ডেল লোড করি (যেমন পথটি অ্যাপ্লিকেশন -> বান্ডেল এ -> বান্ডেল বি), তবে বান্ডেল বি কোনও দেখতে সক্ষম হবে না বান্ডেল এ প্রতীক? এবং যদি হ্যাঁ, তবে কোনওভাবে এটি সমাধান করার কোনও উপায় আছে? আমি এটা আঘাত করেছি, আমি মনে করি: stackoverflow.com/questions/4193539/...
মিখাইল Edoshin

4
@ নোলোডার: -dynamiclibএকটি জিসিসি পতাকা। এটি -dylibসংকলকটিকে এলডিতে পাস করে।
মাইলস

ম্যাক ওএসএক্স-এ এলডি-র জন্য ম্যান পেজের জন্য আপডেট হওয়া URL: manpages.info/macosx/ld.1.html
নেটপোটিটিকা

18

ফাইলটি .so ভাগ করা লাইব্রেরির জন্য কোনও UNIX ফাইল এক্সটেনশন নয়।

এটি কেবল একটি সাধারণ হয়ে ওঠে।

আরনাউডরেসিপস শেয়ারডলিব পৃষ্ঠায় লাইন 3 বি চেক করুন

মূলত .dlib হ'ল ম্যাক ফাইল এক্সটেনশানটি একটি ভাগ করা lib নির্দেশ করতে ব্যবহৃত হয়।


9
@ninefingers। সঠিক। তবে কিছু কিছু ডিফল্ট মানগুলি ব্যবহার করবে যদি না কোনও কিছু খুব স্পষ্ট থাকে। উদাহরণস্বরূপ - -l <লিব> পতাকা ব্যবহার করা হলে সংকলকগণ প্ল্যাটফর্ম নির্দিষ্ট ভাগ করে নেওয়া লাইব্রে এক্সটেনশন ব্যবহার করবেন (প্রকৃত পতাকা খুব কম্পাইলার জুড়ে পারে)।
মার্টিন ইয়র্ক

14

.Dlib এবং .so এর মধ্যে পার্থক্য ম্যাক ওএস এক্স এ কীভাবে সংকলন করা হয়। .So ফাইলগুলির জন্য আপনি ভাগ করে নেবেন এবং .dlib এর জন্য আপনি -dnamiclib ব্যবহার করেন। .So এবং .dlib উভয়ই ডায়নামিক লাইব্রেরি ফাইল হিসাবে বিনিময়যোগ্য এবং হয় DYLIB বা BUNDLE হিসাবে টাইপ রয়েছে। এটি দেখানো বিভিন্ন ফাইলগুলির জন্য পঠনযোগ্য হেরেস।

libtriangle.dylib:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00       DYLIB    17       1368   NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS



libtriangle.so:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00       DYLIB    17       1256   NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS

triangle.so:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00      BUNDLE    16       1696   NOUNDEFS DYLDLINK TWOLEVEL

ম্যাক ওএস এক্সের সাথে দু'জনের সমতুল্য হওয়ার কারণটি অন্যান্য ইউনিক্স ওএস প্রোগ্রামগুলির সাথে পিছনের সামঞ্জস্যের জন্য যা .so ফাইলের ধরণের সাথে সংকলন করে।

সংকলন নোটগুলি: আপনি একটি লিখিত পদক্ষেপের সময় ডায়নামিক লাইব্রেরিতে কোনও .so ফাইল বা .dlib ফাইল সংকলন করতে হবে কিনা তা লিখুন। আপনি লিঙ্কিং কমান্ড-ইনস্টল_নাম এবং ফাইল পাথ যোগ করে এটি করেন। আপনি যদি এটি না করেন তবে আপনি এই পোস্টে দেখা সমস্যার মধ্যে চলে যাবেন: ম্যাক ডায়নামিক লাইব্রেরি ক্রেজিনেস (কেবলমাত্র ফোর্টরান হতে পারে)


আমি কীভাবে ফাইল বান্ডিলের চেয়ে ফাইলগুলি ./configureতৈরি করতে পারি ? এই কাজটি করে না .dylib.so./configure --enable-shared
অ্যাডমিয়া

আমার অভিজ্ঞতা থেকে ম্যাকের বেশিরভাগ কনফিগারেশন ফাইলগুলি হয় .so ফাইল বা একটি স্ট্যাটিক লাইব্রেরি ফাইল তৈরি করবে কারণ কনফিগারেশন ফাইলগুলি স্ট্যান্ডার্ড ইউনিক্স / লিনাক্স ফাইলের নাম ব্যবহার করছে।
জ্যাকারি ক্রাউস

4

ওএসএক্সে চতুর কোড তৈরি করার সময় আমি কেবলমাত্র একটি পর্যবেক্ষণ করেছি:

cmake ... -DBUILD_SHARED_LIBS=OFF ...

.so ফাইলগুলি তৈরি করে

যখন

cmake ... -DBUILD_SHARED_LIBS=ON ...

.dnlib ফাইল তৈরি করে।

সম্ভবত এটি কাউকে সাহায্য করে।

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