আপনি কিভাবে বাইনারি লাইব্রেরির অবস্থান নির্দিষ্ট করবেন? (লিনাক্স)


34

এই প্রশ্নের জন্য আমি একটি নির্দিষ্ট উদাহরণ ব্যবহার করব, তবে সত্যিই এটি লিনাক্সের প্রায় কোনও বাইনারি যা তার 'নির্ভরযোগ্য লাইব্রেরিগুলি খুঁজে পেতে পারে না বলে মনে হয় to সুতরাং, আমার একটি প্রোগ্রাম রয়েছে যা গ্রন্থাগার হারিয়ে যাওয়ার কারণে চলবে না:

./cart5: error while loading shared libraries: libcorona-1.0.2.so: cannot open shared object file: No such file or directory

এলডিডি এই বিষয়ে কিছুটা আলোকপাত করেছে:

linux-vdso.so.1 =>  (0x00007fff18b01000)
libcorona-1.0.2.so => not found
libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.3/libstdc++.so.6 (0x00007f0975830000)
libm.so.6 => /lib/libm.so.6 (0x00007f09755af000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f0975399000)
libc.so.6 => /lib/libc.so.6 (0x00007f0975040000)
libz.so.1 => /lib/libz.so.1 (0x00007f0974e2b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0975b36000)

তবে করোনায় ইনস্টল করা আছে:

oliver@human$ find / -name libcorona-1.0.2.so 2> /dev/null

/usr/local/lib64/libcorona-1.0.2.so
/home/oliver/installed/corona-1.0.2/src/.libs/libcorona-1.0.2.so

"গুম" লাইব্রেরিটি কোথায় খুঁজতে হবে বাইনারিটিকে আমি কীভাবে বলব?

উত্তর:


43

একবার বন্ধ LD_LIBRARY_PATHকরার জন্য, অনুসন্ধানের জন্য কোলন-বিচ্ছিন্ন ডিরেক্টরিগুলির তালিকাতে ভেরিয়েবলটি সেট করুন । এটি PATHএক্সিকিউটেবলের জন্য অনুরূপ , প্রমিত সিস্টেম ডিরেক্টরিগুলি অতিরিক্তভাবে পরিবেশের মাধ্যমে নির্দিষ্টকরণগুলির পরে অনুসন্ধান করা হয়।

LD_LIBRARY_PATH=/usr/local/lib64 ./cart5

আপনার যদি এমন কোনও প্রোগ্রাম থাকে যা গ্রন্থাগারগুলিকে একটি মানহীন স্থানে রাখে এবং সেগুলি নিজেই এটি সন্ধান করতে না পারে তবে আপনি একটি র‍্যাপার স্ক্রিপ্ট লিখতে পারেন:

#!/bin/sh
if [ -n "$LD_LIBRARY_PATH" ]; then
  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64
else
  LD_LIBRARY_PATH=/usr/local/lib64
fi
export LD_LIBRARY_PATH
exec /path/to/cart5 "$@"

স্ট্যান্ডার্ড সিস্টেম ডিরেক্টরিগুলির তালিকা রাখা আছে /etc/ld.so.conf। সাম্প্রতিক সিস্টেমগুলি এই ফাইলটিকে অন্য ফাইলগুলি অন্তর্ভুক্ত করার অনুমতি দেয়; আপনার যদি এর মতো কিছু থাকে তবে আপনি যুক্ত করতে চান ডিরেক্টরিগুলি সহ include /etc/ld.so.conf.d/*.confএকটি নতুন ফাইল তৈরি /etc/ld.so.conf.d/mala.confকরুন। আপনি পরিবর্তন /etc/ld.so.confবা একটি অন্তর্ভুক্ত ফাইলের পরে, /sbin/ldconfigআপনার পরিবর্তনগুলি কার্যকর করতে চালান (এটি একটি ক্যাশে আপডেট করে)।

( LD_LIBRARY_PATHএছাড়াও FreeBSD 'র, NetBSD বা, OpenBSD, সোলারিস এবং Tru64 সহ অন্যান্য অনেক unices, প্রযোজ্য। এইচপি-ইউএক্স হয়েছে SHLIB_PATHএবং Mac OS X হয়েছে DYLD_LIBRARY_PATH/etc/ld.so.confআরও ব্যাপক ভাবে সবচেয়ে unices কিন্তু অবস্থান এবং বাক্য গঠন পৃথক উপর সহধর্মীদের আছে।)


1
কল্পনাপ্রসূত, আপনাকে অনেক ধন্যবাদ। /Etc/ld.so.conf সম্পর্কে আমার কোনও ধারণা ছিল না এবং এটি ভবিষ্যতে আমার পক্ষে খুব কার্যকর হবে।
মালা

15

আপনি যদি LD_LIBRARY_PATH এড়াতে চান তবে লিঙ্ক দেওয়ার সময় আপনি এটিও করতে পারেন:

gcc -o exename -L/path/to/dynamiclib/ -lnameofLib \
    -Wl,-R/path/to/dynamiclib/ sourceCode1.c ...

-ডাব্লুএল, ... লিংককারীকে অতিরিক্ত কমান্ড দেওয়ার জন্য ব্যবহৃত হয় এবং এই ক্ষেত্রে, -আর দিয়ে আপনি লিঙ্কারকে এই পথটিকে .so এর জন্য "ডিফল্ট অনুসন্ধানের পথ" হিসাবে সংরক্ষণ করতে বলছেন।

আমি এই জাতীয় অনেকগুলি ছোট টিপসের নোটগুলি আমার সাইটে রাখি:

https://www.thanassis.space/tricks.html


তবে যদি প্রশ্নে থাকা লাইব্রেরি নিজেই অনুসন্ধানের জন্য লাইব্রেরিগুলি ভাগ করে নিয়ে থাকে তবে বাইনারিটিতে সঞ্চিত আরপ্যাথটি উপ-লাইব্রেরি লুকআপগুলিতে পুনরাবৃত্তভাবে প্রয়োগ করা হয় না। পরিবেশে এলডি_লিবিআরএআইএপিএটিএইচ স্থাপন করা ছাড়া আমি এর কাছাকাছি উপায় খুঁজে পাইনি, যা পুনরাবৃত্ত অনুসন্ধানগুলির জন্য প্রয়োগ করা হয় ...
এথান

@ ইথান: সত্য। তবে এটিও সত্য যে সাধারণ পরিস্থিতিতে আপনি কিছু বাইনারিগুলির জন্য ভাগ করে নেওয়া লাইব্রেরিগুলিকে "প্যাকেজ" করতে চান, আপনি সেগুলি একসাথে রেখেছেন; উদাহরণস্বরূপ /opt/mypackage/bin/someBinaryআপনার সঞ্চিত libs প্রয়োজন হবে /opt/mypackage/lib/। খুব সুন্দর / অপ্টের অধীনে ইনস্টল করা সমস্ত মালিকানাধীন এসডাব্লু এই নিয়মটি অনুসরণ করে - যার অর্থ উপরে দেখানো উপায়টি এই জাতীয় সমস্ত ইনস্টলগুলি কভার করবে। তারপরে তারা সাধারণত / usr / bin এর অধীনে একটি সিমিলিংক যুক্ত করবে যা বাইনারিটিকে আন্ডার / অপ্টের দিকে নির্দেশ করে - জেনে যে "ডিফল্ট অনুসন্ধানের পথ" .soউপযুক্ত /opt/.../libফোল্ডারের নীচে সন্ধান করবে ।
ttsiodras

হ্যাঁ, আমার ক্ষেত্রে আমি একটি প্যাকেজটি এটি ইনস্টল করার পরিবর্তে তার বিল্ড ডিরেক্টরিটির সাথে লিঙ্ক করে পরীক্ষা করতে চাইছিলাম ... (তবে প্যাকেজের বেশ কয়েকটি অভ্যন্তরীণ ছিল some কিছু আন্তঃনির্ভরশীলতার সাথে ... বিভিন্ন ধরণের কাজ কিন্তু কেবল বিরক্তিকর)
21 ইথান এথন 21

0

এটি ইঙ্গিত করে যে লাইবকোরোনা সঠিক পথে ইনস্টল করা নেই। Libcorona ডিরেক্টরিটি সঠিক পথে সরান, সমস্যাটি সমাধান হয়ে যাবে ..


এটি অন্যান্য উত্তরের চেয়ে কীভাবে ভাল?
টোটো

@ টোটো অন্যান্য জবাবগুলির মতো নয়, আপনি ম্যানুয়ালি ফাইলগুলি ইনস্টল করছেন ... যদিও এর সঠিক অর্থ এই উত্তরটি আরও ভাল নয়, তবে এটি এমন একটি বিকল্প যা বিবেচনা করা উচিত (লোকেরা উইন্ডোতে লাইব্রেরি অনুলিপি করে এটিও করেন) system32 / sysWOW64 যখন তাদের অ্যাপ্লিকেশনগুলি সেগুলি খুঁজে না পায়), এটি সুপারিশ করা নয়, কারণ এটি দৃ strongly়ভাবে নিরুৎসাহিত।
টিসিএল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.