ld varolan bir kütüphaneyi bulamıyor


169

Bu Debian lenny sisteminde g ++ ile bir uygulamayı bağlamaya çalışıyorum. ld belirtilen kütüphaneleri bulamadığından şikayet ediyor. Burada belirli bir örnek ImageMagick, ama ben de birkaç kütüphane ile benzer sorunları yaşıyorum.

Bağlayıcı ile çağırıyorum:

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

ld şikayet ediyor:

/usr/bin/ld: cannot find -lmagic

Bununla birlikte, libmagic vardır:

$ 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

Bu sorunu nasıl daha ayrıntılı teşhis edebilirim ve ne olabilir? Tamamen aptalca bir şey mi yapıyorum?

Yanıtlar:


158

Sorun linker arıyor libmagic.soama sadecelibmagic.so.1

Hızlı bir hack Sembolik bağın olduğunu libmagic.so.1içinlibmagic.so


3
işe yarıyorsa, dosyayı varsayılan olarak tamamen işe yaramaz bir şekilde adlandıracağı konusunda şaşırdım - neden varsayılan olarak bunu yapacağına dair herhangi bir fikir verebilir misiniz?
maxpenguin

5
Foo.so.1, foo.so.1.0.0 için de bir sembolik bağlantıdır. Bu şekilde, sisteminizde bir kütüphanenin birkaç sürümüne sahip olabilirsiniz ve bir uygulamanın belirli bir uygulamaya ihtiyacı varsa, buna bağlanabilir, genel olarak en yeni olanı symlink tarafından seçilir. Bu symlink'in neden eksik olduğunu bilmiyorum.
Svante

46
libmagic.so.1 dinamik bağlayıcı tarafından kullanılan sonattır; libmagic.so bağlayıcı tarafından kullanılır ve genellikle -dev paketindeki başlıklarla birlikte kullanılır. -Dev paketi yüklenmediğinden symlink eksik olabilir.
CesarB

13
Ben aynı sorunu vardı ... "hack" yerine "* -devel" sürümünü yükledim ve derleme düzeltildi.
Trevor Boyd Smith

4
Libmagic.so.1'i libmagic.so'ya nasıl bağlayabilirim? Ve bu "devel" paketlerini nerede bulabilirim
Black

69

Sadece grepsedawk tarafından formüle edildiği gibi, cevap , arama -lseçeneğinde yatmaktadır . Bu komutun man sayfasına bakarsanız, aşağıdakilerden birini yapabilirsiniz:g++ld

  • g++ -l:libmagic.so.1 [...]
  • veya:, g++ -lmagic [...]kitap yolunuzda libmagic.so adlı bir sembol bağlantınız varsa

Veya özet olarak, libkullanırken ön eki bağlarken öneki kaldırın -l. -llibmagicolmalı -lmagic.
phyatt

31

Paylaşılan kütüphaneleri çalışma zamanı bileşenlerine ( libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0) ve geliştirme bileşenlerine ( libmagic-dev: /usr/lib/libmagic.so → …) ayırmak Debian kuralıdır .

Kütüphanenin soyadı olduğundan libmagic.so.1, yürütülebilir dosyaya katıştırılan dize budur, böylece yürütülebilir dosya çalıştırıldığında yüklenen dosya budur.

Ancak, kütüphane -lmagicbağlayıcıya göre belirtildiği için libmagic.so, bu nedenle geliştirme için gereklidir.

Tüm bunların Linux'ta nasıl çalıştığı hakkında ayrıntılar için Diego E. Pettenò: Bağlayıcılar ve adlar konusuna bakın .


Kısacası, yapmalısınız apt-get install libmagic-dev. Bu sadece size libmagic.sodeğil, aynı zamanda derlemek için gerekli diğer dosyaları da verecektir /usr/include/magic.h.


7

Ubuntu'da libtoolkütüphaneleri otomatik olarak çözen yükleyebilirsiniz .

$ sudo apt-get install libtool

Bu ltdlbenim için bir sorun çözdü , hangi olarak kurulmuştu libltdl.so.7ve sadece -lltdlmarka olarak bulunamadı .


hatayı çözemedi -LGL ince olamaz . libtool'un ne yaptığı ve kütüphane sorunlarını nasıl çözdüğü hakkında daha fazla bilgi verebilir misiniz?
Shahryar Saljoughi

4

Kötü bir şekilde yanılmıyorsam libmagicya -lmagicda ImageMagick ile aynı kütüphane değilse. ImageMagick'i istediğinizi belirtiyorsunuz.

ImageMagick, derleyiciye tüm uygun seçenekleri sağlayan bir yardımcı program ile birlikte gelir.

Ör:

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

4

Yukarıda belirtildiği gibi linker arıyor libmagic.so, ama sadece var libmagic.so.1.

Bu sorunu çözmek için bir güncelleme önbelleği uygulayın.

ldconfig -v 

Çalıştırabileceğinizi doğrulamak için:

$ ldconfig -p | grep libmagic

1

Ubuntu deposundan libgl1-mesa-dev'i yüklemek bu sorunu benim için çözdü.


5
Şüphesiz 2008'de maxpenguin ile aynı senaryo hatasından muzdarip değilsiniz.
Sophit

sorunumu çözdü. ne olduğu hakkında daha fazla bilgi verebilir misiniz? ve bu sorunu nasıl çözdü? (yani: libgl1-mesa-dev). teşekkürler
Shahryar Saljoughi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.