Saya tidak dapat menemukan perpustakaan yang ada

169

Saya mencoba menautkan aplikasi dengan g ++ pada sistem Lenian lenny ini. Aku mengeluh itu tidak dapat menemukan perpustakaan yang ditentukan. Contoh spesifik di sini adalah ImageMagick, tetapi saya mengalami masalah yang sama dengan beberapa perpustakaan lain juga.

Saya memanggil penghubung dengan:

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

saya mengeluh:

/usr/bin/ld: cannot find -lmagic

Namun, ada 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

Bagaimana cara saya mendiagnosis masalah ini lebih lanjut, dan apa yang bisa salah? Apakah saya melakukan sesuatu yang benar-benar bodoh?

maxpenguin
sumber

Jawaban:

158

Masalahnya adalah linker mencari libmagic.sotetapi Anda hanya punyalibmagic.so.1

Retas cepat adalah symlink libmagic.so.1kelibmagic.so

grepsedawk
sumber
3
yang bekerja, saya agak bingung bahwa itu akan menamai file dengan cara yang sama sekali tidak berguna secara default - dapatkah Anda memberikan wawasan mengapa ia melakukan ini secara default?
maxpenguin
5
The foo.so.1 juga merupakan symlink ke foo.so.1.0.0. Dengan cara ini, Anda dapat memiliki beberapa versi perpustakaan di sistem Anda, dan jika suatu aplikasi membutuhkan yang spesifik, itu dapat ditautkan, sedangkan secara umum, yang terbaru dipilih oleh symlink. Saya tidak tahu mengapa symlink ini hilang.
Svante
46
libmagic.so.1 adalah soname, digunakan oleh penghubung dinamis; libmagic.so digunakan oleh linker, dan biasanya bersama dengan header dalam paket -dev. Symlink mungkin hilang karena paket -dev tidak diinstal.
CesarB
13
Saya memiliki masalah yang sama ... daripada melakukan "hack", saya menginstal versi "* -devel" dan memperbaiki kompilasi.
Trevor Boyd Smith
4
Bagaimana cara symlink libmagic.so.1 ke libmagic.so? Dan di mana menemukan paket
Black
69

Seperti yang baru saja dirumuskan oleh grepsedawk, jawabannya terletak pada -lpilihan untuk g++menelepon ld. Jika Anda melihat halaman manual dari perintah ini, Anda dapat melakukan:

  • g++ -l:libmagic.so.1 [...]
  • atau g++ -lmagic [...]:, jika Anda memiliki symlink bernama libmagic.so di jalur libs Anda
Piotr Lesnicki
sumber
Atau secara ringkas, hapus libawalan saat menautkannya saat menggunakan -l. -llibmagicseharusnya -lmagic.
phyatt
31

Ini adalah konvensi Debian untuk memisahkan pustaka bersama menjadi komponen runtime ( libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0) dan komponen pengembangan mereka ( libmagic-dev: /usr/lib/libmagic.so → …).

Karena soname library adalah libmagic.so.1, itu adalah string yang tertanam ke dalam executable sehingga file yang dimuat ketika executable dijalankan.

Namun, karena perpustakaan ditentukan -lmagicuntuk linker, itu mencari libmagic.so, itulah mengapa diperlukan untuk pengembangan.

Lihat Diego E. Pettenò: Penghubung dan nama untuk perincian tentang bagaimana semua ini bekerja di Linux.


Singkatnya, kamu harus apt-get install libmagic-dev. Ini tidak hanya memberi Anda libmagic.sotetapi juga file lain yang diperlukan untuk kompilasi seperti /usr/include/magic.h.

singkat
sumber
7

Di Ubuntu, Anda dapat menginstal libtoolyang menyelesaikan perpustakaan secara otomatis.

$ sudo apt-get install libtool

Ini menyelesaikan masalah ltdlbagi saya, yang telah diinstal sebagai libltdl.so.7dan tidak ditemukan hanya -lltdldalam pembuatan.

Tuan Ed
sumber
itu tidak menyelesaikan kesalahan tidak bisa baik -LGL . dapatkah Anda memberikan informasi lebih lanjut tentang apa yang dilakukan libtool dan bagaimana cara memecahkan masalah perpustakaan?
Shahryar Saljoughi
4

Kecuali saya salah besar libmagicatau -lmagicperpustakaan tidak sama dengan ImageMagick. Anda menyatakan bahwa Anda menginginkan ImageMagick.

ImageMagick hadir dengan utilitas untuk memasok semua opsi yang sesuai ke kompiler.

Ex:

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

Seperti disebutkan di atas linker sedang mencari libmagic.so, tetapi Anda hanya punya libmagic.so.1.

Untuk mengatasi masalah ini cukup lakukan cache pembaruan.

ldconfig -v 

Untuk memverifikasi, Anda dapat menjalankan:

$ ldconfig -p | grep libmagic
Miguel Ignacio Iglesias
sumber
1

Menginstal libgl1-mesa-dev dari repo Ubuntu menyelesaikan masalah ini untuk saya.

Kirenpillay
sumber
5
Tentunya Anda tidak menderita bug skrip yang sama dengan maxpenguin pada 2008.
Sophit
itu memecahkan masalah saya. dapatkah Anda memberikan informasi lebih lanjut tentang apa itu? dan bagaimana cara memecahkan masalah ini? (Maksud saya: libgl1-mesa-dev). terima kasih
Shahryar Saljoughi