উবুন্টু কোথায় ভাগ করা লাইব্রেরি সন্ধান করে?


24

আমি যখন এমন একটি প্রক্রিয়া চালিত করি যা রানটাইমের সময় একটি ভাগ করা লাইব্রেরির সাথে লিঙ্ক হয় (প্রক্রিয়া শুরু হওয়ার সাথে সংযুক্ত হয়, পরে সংযুক্ত হয় না dlload()), সেখানে ভাগ করা লাইব্রেরি ( .so) ফাইলটি ছাড়া আর LD_LIBRARY_PATHকোথায় সন্ধান করা হবে ?

পটভূমি:

আমার কাছে কিছু সি ++ কোড রয়েছে যা আমি লিখেছিলাম যা একটি নির্দিষ্ট তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করে। আমি গ্রন্থাগারটি ইনস্টল করেছি এবং আমার কোড দুটি পৃথক প্ল্যাটফর্মগুলিতে উবুন্টু তবে বিভিন্ন সংস্করণ এবং জিসিসির বিভিন্ন সংস্করণে সংকলন করেছি। গ্রন্থাগারটি উত্স থেকে সংকলিত এবং ইনস্টল করা হয়েছিল এবং /usr/local/libউভয় প্ল্যাটফর্মে অবস্থিত । আমি যখন আমার কোডটি সংকলন করি তখন আমি pkg-config --libsতৃতীয় পক্ষের লাইব্রেরির পরামিতিগুলির সাথে লিঙ্ক করি এবং আমি যাচাই করেছি যা pkg-config --libsউভয় প্ল্যাটফর্মে ঠিক একই জিনিসটি দেয়।

আমার কোড উভয় প্ল্যাটফর্মে সফলভাবে সংকলন করেছে এবং উভয় প্ল্যাটফর্মগুলিতে LD_LIBRARY_PATHসংজ্ঞায়িত (বা খালি হিসাবে সংজ্ঞায়িত "") নয়। যাইহোক, আমি যখন এটি একটি প্লাটোফর্মে চালাই তবে এটি সূক্ষ্মভাবে কাজ করে এবং অন্যদিকে আমি এই ত্রুটিটি পাই:

error while loading shared libraries: libthrift-0.9.0.so: cannot open shared object file: No such file or directory

আনন্দের সাথে যথেষ্ট, যেগুলি কাজ করে না তা হ'ল উবুন্টু এবং জিসিসির নতুন সংস্করণ। : /

সুতরাং আমি কীভাবে কর্মরত ব্যক্তিটি গ্রন্থাগারটি সনাক্ত করতে সক্ষম তা বুঝতে চেষ্টা করছি, যাতে আমি ভাঙাটিকে একইভাবে লাইব্রেরিটি সনাক্ত করতে পারি। (অর্থাত্, সেট না করে LD_LIBRARY_PATH)

হালনাগাদ:

এখানে থেকে আমার আউটপুট cat /etc/ld.so.conf.d/*

... ওয়ার্কিং (পুরানো) সিস্টেমে:

/usr/lib/mesa
/usr/lib32/mesa
/usr/lib/alsa-lib
# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

... ভাঙা (আরও নতুন) সিস্টেমে:

# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/mesa

1
আমি মনে করি places স্থানগুলি সংজ্ঞায়িত করা হয়েছে /etc/ld.so.conf.d/*.confতবে আমি এটি সম্পর্কে নিশ্চিত নই।
সালেম

এটা মত মনে হয়, কিন্তু ঐ ফাইল বিষয়বস্তু জন্য OQ আমার আপডেট দেখতে ... সুতরাং এটা দেখে মনে হচ্ছে এটি খুঁজে উচিত /usr/local/lib/libthrift-0.9.0.soকিন্তু এখনও এটি ভুল দেয় error while loading shared libraries: libthrift-0.9.0.so: cannot open shared object file: No such file or directory... সেখানে কোন কারণে এটা হবে কি না থেকে একটি ডিরেক্টরি কুড়ান /etc/ld.so.conf.d/*.conf?
ডেভ লিলিথুন

3
sudo ldconfig -vনীচে প্রস্তাবিত হিসাবে চালানোর চেষ্টা করুন । যদি এটি এখনও কাজ না করে তবে আপনার প্রশ্নটির আউটপুট নিয়ে আপডেট করুন ldd /path/to/your/application
সালেম

উত্তর:


29

এই পুরো পাথ ব্যবসাটি মাল্টি-আর্চ নামে পরিচিত এমন কিছু সম্পর্কিত। মূলত এটি আপনাকে একই সিস্টেমে 32 বিট এবং 64 বিট লাইব্রেরি রাখার অনুমতি দেয়।

আপনি ফাইলটি অনুলিপি করার পরে, আপনি কি এলডিকনফিগ চালানোর জন্য ঘটেন?

ldconfig  creates,  updates,  and removes the necessary links and cache
       (for use by the run-time linker,  ld.so)  to  the  most  recent  shared
       libraries  found  in  the directories specified on the command line, in
       the file /etc/ld.so.conf, and in the trusted directories (/usr/lib  and
       /lib).   ldconfig  checks the header and file names of the libraries it
       encounters when determining which  versions  should  have  their  links
       updated.  ldconfig ignores symbolic links when scanning for libraries.

আমি দৌড়ে এসেছি sudo ldconfigএবং সমস্যার সমাধান! (আমার কোড বা কোনও কিছুর পুনরায় সংকলনের দরকার নেই ...) আমি কেবল বুঝতে চাই, আপনি ... "আপনি ফাইলটি অনুলিপি করার পরে" বলেছিলেন, কিন্তু আমি কোনও ফাইল অনুলিপি করিনি। আপনার অর্থ কি আমি লাইব্রেরিটি তৈরি ও ইনস্টল করার পরে বা আমার প্রোগ্রাম সংকলনের পরে করেছি?
ডেভ লিলিথুন

আপনি এটি স্থাপন করার পরে মূলত একটি লাইব্রেরি ক্যাশে নির্মিত হয়। আমি মনে করি রিবুট করা ক্যাশেটিকে আবারও তৈরি করতে পারে।
ম্যাট এইচ

আমার ভুল হতে পারে, তবে আমি বিশ্বাস করি যে আমি লাইব্রেরি ইনস্টল করার পর থেকে রিবুট করেছি ... তবে, sudo ldconfigকৌশলটি চালিয়ে গেল। এটি কি কোনও কিছু গ্রন্থাগার প্রায়শই স্বয়ংক্রিয়ভাবে তাদের ইনস্টলের অংশ হিসাবে আপনার জন্য চালিত হয়, এবং এটি কোনও কারণে হয়নি? শুধু ভাবছি কেন আমাকে "সাধারনত"
এগুলি

সাধারণত আমার মনে হয় ইনস্টল প্রক্রিয়া চলাকালীন প্যাকেজ ইনস্টলটি ldconfig চলবে। হতে পারে আপনার নতুন ডিস্ট্রোর সংস্করণটি কোনও কারণে এটি করছে না।
ম্যাট এইচ

1

উপরের প্রশ্ন এবং প্রথম (এবং কেবল এটিটি) উত্তরের অন্তর্ভুক্ত তথ্য আমাকে ডাব্লুএসএল উবুন্টুতে (উইন 10 64৪) আমার * অনুরূপ * ইস্যুটি সমাধান করতে সহায়তা করেছে !

আমার ক্ষেত্রে এক্সিকিউটেবল একটি লাইব্রেরি খুঁজে পেল না। আমি চরমভাবে লক্ষ্য করেছি যে, সদ্য বানানো লাইব্রেরিতে স্থান পেয়েছে /usr/lib64, কিন্তু বহু খিলান লাইন /etc/ld.so.conf.d/x86_64-linux-gnu.conf হয়নি না ডিরেক্টরিটি অন্তর্ভুক্ত।

তাই আমি দৌড়ে গেলাম

sudo ldconfig /usr/lib64

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


আমার সাথে একইভাবে ঘটেছিল / ইউএসআর / স্থানীয় / লাইব / সাথে। আমি একটি ফাইল তৈরি করেছি /etc/ld.so.conf.d/usr-local.confএবং তারপরে sudo ldconfigকোনও প্রভাব ছাড়াই দৌড়েছি - সেই দির লাইব্রেরিগুলি লোডার দ্বারা পাওয়া যায় নি। রান করার পরে sudo ldconfig /usr/local/libসবকিছু ঠিকঠাক কাজ করেছে।
জোশ মিলথর্প
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.