Vaše knihovna je dynamická knihovna. Musíte operačnímu systému sdělit, kde ji může za běhu najít.
K tomu budeme muset provést tyto snadné kroky:
(1) Zjistěte, kde je knihovna umístěna, pokud ji neznáte.
sudo find / -name the_name_of_the_file.so
(2) Zkontrolujte existenci proměnné prostředí cesty dynamické knihovny (LD_LIBRARY_PATH
)
$ echo $LD_LIBRARY_PATH
pokud zde není nic k zobrazení, přidejte výchozí hodnotu cesty (nebo ne, pokud chcete)
$ LD_LIBRARY_PATH=/usr/local/lib
(3) Přidáme cestu přání, exportujeme ji a vyzkoušíme aplikaci.
Všimněte si, že cesta by měla být adresář, kde je path.so.something
is.So if path.so.something
je v /my_library/path.so.something
mělo by to být:
$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_library/
$ export LD_LIBRARY_PATH
$ ./my_app
zdroj:http://www.gnu.org/software/gsl/manual/html_node/Shared-Libraries.html
Zde je několik řešení, která můžete vyzkoušet:
ldconfig
Jak zdůraznil AbiusX:Pokud jste právě nainstalovali knihovnu, možná budete muset jednoduše spustit ldconfig.
sudo ldconfig
ldconfig vytvoří potřebné odkazy a mezipaměť na nejnovější sdílené knihovny nalezené v adresářích zadaných na příkazovém řádku, v souboru /etc/ld.so.conf a v důvěryhodných adresářích (/lib a /usr/lib).
Obvykle se o to postará váš správce balíčků, když instalujete novou knihovnu, ale ne vždy, a nebude na škodu spustit ldconfig, i když to není váš problém.
Vývojářský balíček nebo nesprávná verze
Pokud to nefunguje, také bych se podíval na Paulův návrh a hledal "-dev" verzi knihovny. Mnoho knihoven je rozděleno na balíčky pro vývojáře a balíčky, které nejsou pro vývojáře. K jeho vyhledání můžete použít tento příkaz:
apt-cache search <libraryname>
To může také pomoci, pokud máte jednoduše nainstalovanou špatnou verzi knihovny. Některé knihovny jsou publikovány v různých verzích současně, například Python.
Umístění knihovny
Pokud jste si jisti, že je nainstalován správný balíček a ldconfig jej nenašel, může být pouze v nestandardním adresáři. Ve výchozím nastavení vypadá ldconfig v /lib
, /usr/lib
a adresáře uvedené v /etc/ld.so.conf
a $LD_LIBRARY_PATH
. Pokud je vaše knihovna někde jinde, můžete buď přidat adresář na samostatný řádek v /etc/ld.so.conf
, přidejte cestu knihovny do $LD_LIBRARY_PATH
nebo přesuňte knihovnu do /usr/lib
. Poté spusťte ldconfig
.
Chcete-li zjistit, kde se knihovna nachází, zkuste toto:
sudo find / -iname *libraryname*.so*
(Nahraďte libraryname
s názvem vaší knihovny)
Pokud půjdete na $LD_LIBRARY_PATH
trasu, budete to chtít vložit do ~/.bashrc
soubor, takže se spustí pokaždé, když se přihlásíte:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/library
Aktualizovat
I když to, co píšu níže, platí jako obecná odpověď o sdílených knihovnách, myslím si, že nejčastější příčinou těchto druhů zpráv je to, že jste nainstalovali balíček, ale nenainstalovali jste verzi "-dev" tohoto balíčku.
No, nelže – žádné libpthread_rt.so.1
neexistuje v tom výpisu. Pravděpodobně ji budete muset překonfigurovat a znovu sestavit tak, aby závisela na knihovně, kterou máte, nebo nainstalovat cokoliv poskytuje libpthread_rt.so.1
.
Obecně platí, že čísla za .so jsou čísla verzí a často zjistíte, že se jedná o vzájemné symbolické odkazy, takže pokud máte verzi 1.1 libfoo.so, budete mít skutečný soubor libfoo.so.1.0, a symbolické odkazy foo.so a foo.so.1 ukazující na libfoo.so.1.0. A pokud nainstalujete verzi 1.1, aniž byste odstranili tu druhou, budete mít libfoo.so.1.1 a libfoo.so.1 a libfoo.so budou nyní ukazovat na novou verzi, ale jakýkoli kód, který vyžaduje tuto přesnou verzi, může použijte soubor libfoo.so.1.0. Kód, který se spoléhá pouze na API verze 1, ale nezáleží na tom, zda je 1.0 nebo 1.1, bude specifikovat libfoo.so.1. Jak orip zdůraznil v komentářích, je to dobře vysvětleno na http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html.
Ve vašem případě můžete pryč se symbolickým odkazem libpthread_rt.so.1
na libpthread_rt.so
. Žádné záruky, že neporuší váš kód a nesní vaše televizní večeře.