2008-12-03 19 views
150

मैं इस डेबियन लनी सिस्टम पर g ++ के साथ किसी एप्लिकेशन को लिंक करने का प्रयास कर रहा हूं। एलडी शिकायत कर रहा है कि यह निर्दिष्ट पुस्तकालयों को नहीं ढूंढ सकता है। यहां विशिष्ट उदाहरण ImageMagick है, लेकिन मुझे कुछ अन्य पुस्तकालयों के साथ भी इसी तरह की समस्याएं आ रही हैं।ld मौजूदा लाइब्रेरी नहीं ढूंढ सकता

मैं साथ लिंकर बोल रहा हूँ:

g++ -w (..lots of .o files/include directories/etc..) \ 
-L/usr/lib -lmagic 

ld शिकायत:

/usr/bin/ld: cannot find -lmagic 

हालांकि, libmagic मौजूद है:

$ locate libmagic.so 
/usr/lib/libmagic.so.1 
/usr/lib/libmagic.so.1.0.0 
$ ls -all /usr/lib/libmagic.so.1* 
lrwxrwxrwx 1 root root 17 2008-12-01 03:52 /usr/lib/libmagic.so.1 -> libmagic.so.1.0.0 
-rwxrwxrwx 1 root root 84664 2008-09-09 00:05 /usr/lib/libmagic.so.1.0.0 
$ ldd /usr/lib/libmagic.so.1.0.0 
    linux-gate.so.1 => (0xb7f85000) 
    libz.so.1 => /usr/lib/libz.so.1 (0xb7f51000) 
    libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7df6000) 
    /lib/ld-linux.so.2 (0xb7f86000) 
$ sudo ldconfig -v | grep "libmagic" 
    libmagic.so.1 -> libmagic.so.1.0.0 

मैं कैसे इस समस्या को आगे का निदान करते हैं, और क्या गलत हो सकता है? क्या मैं कुछ पूरी तरह बेवकूफ कर रहा हूँ?

उत्तर

138
समस्या

है लिंकर libmagic.so की तलाश में है, लेकिन आप केवल libmagic.so.1

एक त्वरित हैक libmagic.so

+3

कि काम करता है, मैं एक तरह से उलझन में है कि यह डिफ़ॉल्ट रूप से एक पूरी तरह से बेकार तरह से फ़ाइल को नाम होगा हूँ - अगर आप किसी भी जानकारी प्रदान कर सकते यह करना होगा क्यों डिफ़ॉल्ट रूप से यह? – maxpenguin

+0

सबसे अधिक संभावना है कि यह स्थापित स्क्रिप्ट – grepsedawk

+5

की गलत कॉन्फ़िगरेशन है foo.so.1 foo.so.1.0.0 को भी एक सिम्लिंक है। इस तरह, आपके सिस्टम में लाइब्रेरी के कई संस्करण हो सकते हैं, और यदि किसी एप्लिकेशन को किसी विशिष्ट व्यक्ति की आवश्यकता होती है, तो यह उससे लिंक हो सकता है, जबकि सामान्य रूप से, नवीनतम सिमलिंक द्वारा चुना जाता है। मुझे नहीं पता कि यह सिम्लिंक क्यों गुम हो गया था। – Svante

4

को libmagic.so.1 सिमलिंक के लिए जब तक मैं बुरी तरह से गलत कर रहा हूँ libmagic या -lmagic रूप में एक ही पुस्तकालय नहीं है है ImageMagick। आप बताते हैं कि आप ImageMagick चाहते हैं।

ImageMagick कंपाइलर को सभी उपयुक्त विकल्पों की आपूर्ति करने के लिए उपयोगिता के साथ आता है।

पूर्व:

g++ program.cpp `Magick++-config --cppflags --cxxflags --ldflags --libs` -o "prog" 
57

सिर्फ grepsedawk द्वारा तैयार के रूप में, इस सवाल का जवाब, g++ की -l विकल्प में निहित है ld बुला। आप इस आदेश का आदमी पृष्ठ देख रहे हैं, तो आप या तो कर सकते हैं:

  • g++ -l:libmagic.so.1 [...]
  • या: g++ -lmagic [...], यदि आप अपने libs रास्ते में libmagic.so नाम के एक सिमलिंक है
+0

या संक्षेप में, '-l' का उपयोग करते समय इसे लिंक करते समय 'lib' उपसर्ग को हटा दें। '-llibmagic'' -lmagic' होना चाहिए। – phyatt

30

यह साझा लाइब्रेरी को अपने रनटाइम घटकों (libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0) और उनके विकास घटकों (libmagic-dev: /usr/lib/libmagic.so → …) में अलग करने के लिए डेबियन सम्मेलन है।

क्योंकि लाइब्रेरी का बेटा libmagic.so.1 है, वह स्ट्रिंग है जो निष्पादन योग्य में एम्बेडेड हो जाती है, इसलिए वह फ़ाइल है जो निष्पादन योग्य होने पर लोड की जाती है।

हालांकि, क्योंकि लाइब्रेरी को -lmagic लिंकर के रूप में निर्दिष्ट किया गया है, यह libmagic.so की तलाश में है, यही कारण है कि विकास के लिए इसकी आवश्यकता है।

Diego E. Pettenò: Linkers and names देखें कि यह सब लिनक्स पर कैसे काम करता है।


संक्षेप में, आपको apt-get install libmagic-dev होना चाहिए। इससे आपको libmagic.so न केवल /usr/include/magic.h जैसे संकलन के लिए आवश्यक अन्य फ़ाइलें भी मिलेंगी।

6

उबंटू में, आप libtool इंस्टॉल कर सकते हैं जो स्वचालित रूप से पुस्तकालयों को हल करता है।

$ sudo apt-get install libtool 

यह जो libltdl.so.7 के रूप में स्थापित किया गया था और बस -lltdl मेकअप में के रूप में नहीं मिला था मेरे लिए ltdl के साथ एक समस्या का समाधान।

+0

यह त्रुटि हल नहीं किया ** ठीक नहीं हो सकता -एलजीएल **। क्या आप कृपया libtool क्या करता है और पुस्तकालय के मुद्दों को हल करने के तरीके के बारे में अधिक जानकारी दे सकते हैं? –

1

उबंटू रेपो से libgl1-mesa-dev स्थापित करने से मेरे लिए यह समस्या हल हो गई।

+4

निश्चित रूप से आप 2008 में अधिकतम पेंगुइन के रूप में एक ही स्क्रिप्ट बग से पीड़ित नहीं हैं। – Sophit

+0

ने मेरी समस्या हल की। क्या आप कृपया इस बारे में अधिक जानकारी दे सकते हैं कि यह क्या है। और यह इस मुद्दे को कैसे हल करता है? (मेरा मतलब है: libgl1-mesa-dev)। धन्यवाद –

2

जैसा ऊपर बताया गया है लिंकर libmagic.so की तलाश में है, लेकिन आपके पास केवल libmagic.so.1 है।

इस समस्या को हल करने के लिए बस एक अद्यतन कैश करें।

ldconfig -v 

सत्यापित करने के लिए आप चला सकते हैं:

$ ldconfig -p | grep libmagic 
संबंधित मुद्दे