ld не вдається знайти існуючу бібліотеку


169

Я намагаюся зв’язати додаток з g ++ у цій системі Debian lenny. ld скаржиться, що не може знайти вказані бібліотеки. Конкретним прикладом є ImageMagick, але у мене є подібні проблеми і з кількома іншими бібліотеками.

Я дзвоню в зв’язок з:

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

ld скаржиться:

/usr/bin/ld: cannot find -lmagic

Однак лібмагічні існують:

$ 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

Як далі діагностувати цю проблему і що може бути неправильним? Я роблю щось абсолютно дурне?

Відповіді:


158

Проблема в тому, що шукає лінкер, libmagic.soале у вас є тільки вінlibmagic.so.1

Швидкий злом - це посилання libmagic.so.1наlibmagic.so


3
це працює, я здивовано здивований тим, що він би назвав файл абсолютно марним способом за замовчуванням - чи можете ви дати зрозуміти, чому він би робив це за замовчуванням?
maxpenguin

5
Foo.so.1 також є символьним посиланням на foo.so.1.0.0. Таким чином, у вашій системі можна мати кілька версій бібліотеки, і якщо програмі потрібна конкретна, вона може посилатися на неї, тоді як, як правило, найновішу вибирають символьною посиланням. Я не знаю, чому ця символьна посилання відсутня.
Svante

46
libmagic.so.1 - це ім'я, яке використовується динамічним лінкером; libmagic.so використовується лінкером і зазвичай є разом із заголовками в пакеті -dev. Симпосилання може бути відсутнім, оскільки пакет -dev не був встановлений.
CesarB

13
У мене була така ж проблема ... замість того, щоб робити "хак", я встановив "* -devel" версію, і вона виправила компіляцію.
Тревор Бойд Сміт

4
Як позначити libmagic.so.1 до libmagic.so? І де знайти ті "devel" пакети
Чорний

68

Як тільки що сформулював grepsedawk, відповідь лежить у -lваріанті g++виклику ld. Якщо ви подивитеся на довідкову сторінку цієї команди, ви можете:

  • g++ -l:libmagic.so.1 [...]
  • або:, g++ -lmagic [...]якщо у вас є шлях посилання libmagic.so на вашому шляху

Або підсумовуючи, видаліть libпрефікс під час посилання на нього під час використання -l. -llibmagicповинно бути -lmagic.
фіат

31

Це умова Debian розділяти бібліотеки, що діляться, на їх компоненти виконання ( libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0) та компоненти їх розробки ( libmagic-dev: /usr/lib/libmagic.so → …).

Оскільки ім’я бібліотеки є libmagic.so.1, це рядок, який вбудовується у виконуваний файл, так що файл завантажується під час запуску виконуваного файлу.

Однак, оскільки бібліотека вказана як -lmagicлінкер, вона шукає libmagic.so, саме тому вона потрібна для розробки.

Див. Дієго Е. Петтето: Посилання та імена для детальної інформації про те, як це все працює в Linux.


Коротше кажучи, слід apt-get install libmagic-dev. Це дасть вам не лише libmagic.soінші файли, необхідні для компіляції /usr/include/magic.h.


7

В Ubuntu ви можете встановити, libtoolщо розв’язує бібліотеки автоматично.

$ sudo apt-get install libtool

Це вирішило ltdlдля мене проблему , яка була встановлена ​​як libltdl.so.7і не була знайдена так просто -lltdlу створенні.


це не вирішило помилку не може добре -LGL . Ви можете, будь ласка, надати більше інформації про те, що робить libtool та як він вирішує проблеми з бібліотекою?
Шахряр Саляфі

4

Якщо я не помиляюся libmagicабо -lmagicне є такою ж бібліотекою, як ImageMagick. Ви заявляєте, що хочете ImageMagick.

ImageMagick постачається з утилітою, щоб поставити всі відповідні варіанти компілятору.

Наприклад:

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

4

Як згадувалося вище, лінкер шукає libmagic.so, але у вас є тільки він libmagic.so.1.

Для вирішення цієї проблеми просто виконайте кеш оновлення.

ldconfig -v 

Щоб перевірити, чи можна запустити:

$ ldconfig -p | grep libmagic

1

Встановлення libgl1-mesa-dev з Ubuntu repo вирішило цю проблему для мене.


5
Напевно, ви не страждаєте від тієї самої помилки сценарію, що і maxpenguin у 2008 році.
Sophit

це вирішило мою проблему. Ви можете, будь ласка, дати більше інформації про те, що це таке. і як це вирішує це питання? (я маю на увазі: libgl1-mesa-dev). дякую
Шахряр Саляфі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.