GNU/Linux >> Znalost Linux >  >> Linux

usr/bin/ld:nelze najít -l<jménoKnihovny>

Chcete-li zjistit, co linker hledá, spusťte jej v podrobném režimu.

S tímto problémem jsem se například setkal při pokusu o kompilaci MySQL s podporou ZLIB. Během kompilace se mi zobrazila podobná chyba:

/usr/bin/ld: cannot find -lzlib

Provedl jsem nějaké googlování a neustále jsem narážel na různé problémy stejného druhu, kde lidé říkali, aby se ujistili, že soubor .so skutečně existuje, a pokud ne, vytvořte symbolický odkaz na soubor s verzí, například zlib. takže.1.2.8. Ale když jsem to zkontroloval, zlib.so existoval. Tak jsem si říkal, že to určitě nemůže být problém.

Na internetu jsem narazil na další příspěvek, který navrhoval spustit make s LD_DEBUG=all:

LD_DEBUG=all make

I když jsem dostal TUNU ladicích výstupů, ve skutečnosti to nebylo užitečné. Přidalo to více zmatku než cokoli jiného. Takže jsem to chtěl vzdát.

Pak jsem měl zjevení. Myslel jsem, že skutečně zkontroluji text nápovědy pro příkaz ld:

ld --help

Z toho jsem přišel na to, jak spustit ld v podrobném režimu (představte si to):

ld -lzlib --verbose

Toto je výstup, který jsem dostal:

==================================================
attempt to open /usr/x86_64-linux-gnu/lib64/libzlib.so failed
attempt to open /usr/x86_64-linux-gnu/lib64/libzlib.a failed
attempt to open /usr/local/lib64/libzlib.so failed
attempt to open /usr/local/lib64/libzlib.a failed
attempt to open /lib64/libzlib.so failed
attempt to open /lib64/libzlib.a failed
attempt to open /usr/lib64/libzlib.so failed
attempt to open /usr/lib64/libzlib.a failed
attempt to open /usr/x86_64-linux-gnu/lib/libzlib.so failed
attempt to open /usr/x86_64-linux-gnu/lib/libzlib.a failed
attempt to open /usr/local/lib/libzlib.so failed
attempt to open /usr/local/lib/libzlib.a failed
attempt to open /lib/libzlib.so failed
attempt to open /lib/libzlib.a failed
attempt to open /usr/lib/libzlib.so failed
attempt to open /usr/lib/libzlib.a failed
/usr/bin/ld.bfd.real: cannot find -lzlib

Tup, ding, ding...

Abych to konečně opravil, abych mohl zkompilovat MySQL s vlastní verzí ZLIB (spíše než s přibalenou verzí):

sudo ln -s /usr/lib/libz.so.1.2.8 /usr/lib/libzlib.so

Voila!


Pokud je název vaší knihovny, řekněte libxyz.so a nachází se na cestě, řekněme:

/home/user/myDir

pak jej propojit s vaším programem:

g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog

Zdá se, že neexistuje žádná odpověď, která by řešila velmi častý začátečnický problém, kdy se nepodařilo nainstalovat požadovanou knihovnu.

Na platformách Debianish, pokud libfoo chybí, můžete jej často nainstalovat pomocí něčeho jako

apt-get install libfoo-dev

-dev verze balíčku je vyžadována pro vývojovou práci, dokonce i pro triviální vývojovou práci, jako je kompilace zdrojového kódu pro propojení s knihovnou.

Název balíčku bude někdy vyžadovat nějaké dekorace (libfoo0-dev ? foo-dev bez lib předpona? atd.), nebo můžete jednoduše použít vyhledávání balíčků vašeho distribuce, abyste přesně zjistili, které balíčky poskytují konkrétní soubor.

(Pokud je jich více, budete muset zjistit, jaké jsou mezi nimi rozdíly. Výběr toho nejlepšího nebo nejoblíbenějšího je běžná zkratka, ale není to přijatelný postup pro jakoukoli seriózní vývojovou práci.)

Pro jiné architektury (zejména RPM) platí podobné postupy, i když podrobnosti se budou lišit.


Linux
  1. chyba konfigurace phpize:nelze najít zdroje (config.m4)

  2. /usr/bin Vs /usr/local/bin Na Linuxu?

  3. /usr/bin/ls:/usr/bin/ls:Nelze spustit binární soubor?

  1. Nemůžete najít -lm?

  2. Nemohu najít existující knihovnu

  3. Nainstalujte binární soubory do /bin, /sbin, /usr/bin a /usr/sbin, interakce s --prefix a DESTDIR

  1. Chyba kompilace OCaml:/usr/bin/ld:nelze najít -lstr

  2. Jaký je rozdíl mezi #!/usr/bin/env bash a #!/usr/bin/bash?

  3. gcc - chyba /usr/bin/ld:nelze najít <knihovnu> v /usr/local/lib, přestože ji ldconfig uvádí a cesta byla přidána do ld.so.conf