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?
linux
gcc
linker
shared-libraries
shared-objects
maxpenguin
sumber
sumber
Seperti yang baru saja dirumuskan oleh grepsedawk, jawabannya terletak pada
-l
pilihan untukg++
meneleponld
. Jika Anda melihat halaman manual dari perintah ini, Anda dapat melakukan:g++ -l:libmagic.so.1 [...]
g++ -lmagic [...]
:, jika Anda memiliki symlink bernama libmagic.so di jalur libs Andasumber
lib
awalan saat menautkannya saat menggunakan-l
.-llibmagic
seharusnya-lmagic
.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
-lmagic
untuk linker, itu mencarilibmagic.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 Andalibmagic.so
tetapi juga file lain yang diperlukan untuk kompilasi seperti/usr/include/magic.h
.sumber
Di Ubuntu, Anda dapat menginstal
libtool
yang menyelesaikan perpustakaan secara otomatis.Ini menyelesaikan masalah
ltdl
bagi saya, yang telah diinstal sebagailibltdl.so.7
dan tidak ditemukan hanya-lltdl
dalam pembuatan.sumber
Kecuali saya salah besar
libmagic
atau-lmagic
perpustakaan tidak sama dengan ImageMagick. Anda menyatakan bahwa Anda menginginkan ImageMagick.ImageMagick hadir dengan utilitas untuk memasok semua opsi yang sesuai ke kompiler.
Ex:
sumber
Seperti disebutkan di atas linker sedang mencari
libmagic.so
, tetapi Anda hanya punyalibmagic.so.1
.Untuk mengatasi masalah ini cukup lakukan cache pembaruan.
Untuk memverifikasi, Anda dapat menjalankan:
sumber
Menginstal libgl1-mesa-dev dari repo Ubuntu menyelesaikan masalah ini untuk saya.
sumber