Existuje seznam běžných chyb, které v Ubuntu často vidím. Vyskytl se
Jednou z takových častých chyb, které často vidím při instalaci programu ze zdrojového kódu, je
chyba při načítání sdílených knihoven:
nelze otevřít soubor sdíleného objektu:Žádný takový soubor nebo adresář
Například jsem se pokoušel použít server FreeRADIUS a ukázalo se mi tato chyba:
radiusd : error while loading shared libraries:libfreeradius -radius-2.1.10.so:
cannot open shared object file: No such file or directory
Důvodem této chyby je, že knihovny programu byly nainstalovány na místě, kde je dynamický linker nemůže najít.
Dovolte mi, abych vám ukázal, jak můžete tento problém vyřešit.
Opravit Chyba „nelze otevřít soubor sdíleného objektu:Žádný takový soubor nebo adresář“
Jedním rychlým způsobem, jak tuto „chybu při načítání sdílených knihoven“ automaticky opravit, je použít ldconfig.
Vše, co musíte udělat, je otevřít terminál (Ctrl+Alt+T) a zadat následující příkaz:
sudo /sbin/ldconfig -v
Tato jedna vložka by měla problém ve většině případů vyřešit. Pokud tomu tak není, diskutoval jsem o jiném způsobu řešení této chyby. Ale předtím vám řeknu, co dělá výše uvedený příkaz.
Co jsou sdílené objektové soubory? Jak výše uvedený příkaz řeší problém?
Vidíte, v C/C++ je .so (sdílený objekt) zkompilovaný soubor knihovny. Říká se tomu sdílený objekt, protože tento soubor knihovny může sdílet několik programů. Tyto generované knihovny jsou obvykle umístěny v adresářích /lib nebo /usr/lib.
Pokud vás teď zajímá, jak tento malý příkaz vyřešil tento problém, měli byste si přečíst manuálovou stránku
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 ). Mezipaměť používá linker za běhu ld.so nebo ld-linux.so . ldconfig kontroluje záhlaví a názvy souborů knihoven, na které narazí, když určuje, které verze by měly mít aktualizované odkazy.
Doufám, že vám tato rychlá oprava pomůže odstranit ošklivou chybu při načítání zprávy sdílených knihoven v Ubuntu a dalších Linuxu.
Pokud ne, můžete provést průzkum a pokusit se problém vyřešit tak, jak je uvedeno v další části.
Alternativní metoda opravy chyby „nelze otevřít soubor sdíleného objektu“
Výše uvedená metoda řeší problém, pokud je daná knihovna ve vašem systému dostupná. Ale nemusí to tak být vždy.
Pokud nemáte program nainstalovaný ve svém systému, nebudete mít soubor jeho knihovny. ldconfig nemůže dělat nic, pokud neexistuje žádný soubor knihovny.
Alternativní metodou je tedy instalace požadovaného programu a knihovna by se měla vytvořit automaticky.
Dovolte mi, abych vám to ukázal na příkladu. Řekněme, že vidíte tuto chybu:
error while loading shared libraries: libgobject-2.0.so.0: cannot open shared object file: No such file or directory
Problém je s libgobject verze 2.0. Číslo verze je důležité, protože některé programy závisí na konkrétní verzi knihovny, a pokud ji nenajdou, stěžují si na ni.
Nyní apt nabízí možnost vyhledávání, kterou lze použít k vyhledání balíčku a zjištění jeho verze před jeho instalací.
[email protected]:~$ apt search libgobject
Sorting... Done
Full Text Search... Done
librust-gobject-sys-dev/focal 0.9.0-2 amd64
FFI bindings to libgobject-2.0 - Rust source code
Nyní by tento balíček librust-gobject-sys-dev mohl být tím, co potřebujete, pokud víte, že jste se pokoušeli spustit program Rust. Ale co když si na to stěžoval program Python, který jste spouštěli?
Vyhledávání můžete rozšířit odstraněním lib z názvu balíčku během vyhledávání. lib znamená, že knihovna a knihovny mohou být poskytovány generickým balíčkem, který by se mohl jmenovat gobject-xyz.
Bylo by dobré hledat řetězec v názvech balíčku (místo popisu), abyste získali stručnější výsledky.
[email protected]:~$ apt search --names-only gobject
Sorting... Done
Full Text Search... Done
gobject-introspection/focal-updates 1.64.1-1~ubuntu20.04.1 amd64
Generate interface introspection data for GObject libraries
libavahi-gobject-dev/focal 0.7-4ubuntu7 amd64
Development headers for the Avahi GObject library
libavahi-gobject0/focal 0.7-4ubuntu7 amd64
Avahi GObject library
libcairo-gobject-perl/focal,now 1.005-2 amd64 [installed,automatic]
integrate Cairo into the Glib type system in Perl
libcairo-gobject2/focal,now 1.16.0-4ubuntu1 amd64 [installed,automatic]
Cairo 2D vector graphics library (GObject library)
libghc-gi-gobject-dev/focal 2.0.19-1build1 amd64
GObject bindings
libghc-gi-gobject-doc/focal,focal 2.0.19-1build1 all
GObject bindings; documentation
Ve výše uvedeném zkráceném výstupu budete muset zjistit, zda balíček souvisí s původním programem, který jste se snažili spustit. Musíte také zkontrolovat verzi poskytnuté knihovny.
Jakmile identifikujete správný balíček, nainstalujte jej takto:
sudo apt install package_name
Po instalaci můžete znovu spustit příkaz ldconfig a aktualizovat mezipaměť:
sudo /sbin/ldconfig -v
Tato metoda vyžaduje z vaší strany určité úsilí, ale takto se řeší závislosti.
Nic nefunguje, co teď?
Pokud máte smůlu, výše uvedené metody pro vás nemusí fungovat. Co můžete dělat?
Za prvé, mějte na paměti, že sdílené knihovny mohou být v některých případech použity z jiných balíčků. Pokud jste se pokoušeli spustit program XYZ a program ABC nainstaluje správnou verzi sdílené knihovny, může (nebo nemusí) fungovat pro vás. Můžete to zkusit a vyzkoušet.
Za druhé, pokud se pokoušíte spustit program, který je příliš starý nebo příliš nový, může vyžadovat verzi knihovny, která není dostupná pro vaši distribuci Linuxu.
Co můžete udělat, je zkontrolovat, zda můžete použít nějakou jinou verzi programu. Například použití Eclipse verze 3 místo verze 4. To vám může pomoci.
Druhým způsobem by bylo zkontrolovat webovou stránku vývojářů nebo fóra a zjistit, zda můžete ručně nainstalovat správnou verzi knihovny z jejího zdrojového kódu. To vyžaduje velké úsilí (v roce 2020), ale nemáte mnoho možností.
Fungovalo to pro vás?
Doufám, že jsem vám to trochu objasnil. Podařilo se vám vyřešit problém se sdílenými knihovnami ve vašem systému? Pokud máte dotazy, návrhy, neváhejte napsat komentář. Čau :)