GNU/Linux >> Znalost Linux >  >> Ubuntu

Jak vyřešit chybu „nelze otevřít soubor sdíleného objektu“ v distribucích Linuxu založených na Ubuntu

Existuje seznam běžných chyb, které v Ubuntu často vidím. Vyskytl se problém s sloučit seznamu, pak je zde BADSIG chyba, a řada běžných chyb aktualizace Ubuntu.

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ů . Úplná chyba obecně vypadá takto:

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 který říká:

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 :)



Ubuntu
  1. Ubuntu – Jak otevřít soubor .bak na Linuxu?

  2. Jak nakonfigurovat chybové zprávy xdebug pro otevření souboru v editoru Kate na Ubuntu

  3. "chyba při načítání sdílených knihoven:libjli.so:nelze otevřít soubor sdíleného objektu:Žádný takový soubor nebo adresář" chyba "java -version" při spuštění

  1. libstdc++.so.5:nelze otevřít soubor sdíleného objektu - ale knihovna je nainstalovaná a aktuální

  2. libpulse.so.0:nelze otevřít soubor sdíleného objektu:Žádný takový soubor nebo adresář

  3. ImportError:libcblas.so.3:nelze otevřít soubor sdíleného objektu:Žádný takový soubor nebo adresář

  1. Rpm:Chyba při načítání sdílených knihoven:Libz.so.1:Nelze otevřít soubor sdíleného objektu:Žádný takový soubor

  2. Chyba Linuxu při načítání sdílených knihoven:nelze otevřít soubor sdíleného objektu:Žádný takový soubor nebo adresář

  3. libaio.so.1:nelze otevřít soubor sdíleného objektu