Linux-brugere støder ofte på fejlen error loading shared libraries
, når de kører programmer, og den er også velkendt for mange programmører og alle, der ønsker at kompilere software på deres system. Bogstaveligt talt betyder det, at der er et problem under indlæsning af delte biblioteker.
Fejlen"error while
loadingshared lib
raries" betyder, at operativsystemet ikke kunne finde og indlæse et eller flere biblioteker, som er nødvendige for at få programmet til at fungere, når det kører et program eller et script. Dette er et almindeligt problem i UNIX-lignende operativsystemer. Når et program kompileres, kan det henvise til forskellige eksterne biblioteker, som skal være tilgængelige på kørselstidspunktet. Hvis disse biblioteker mangler eller ikke er tilgængelige, opstår der en fejl under indlæsning af delte biblioteker.
Selv om du ikke kompilerer dine programmer, kan du se denne fejl: directory_name: cannot open shared object file: No such file or directory
ganske ofte, når du installerer nye programmer, der ikke kommer via pakkehåndteringen, eller programmer, der er beregnet til en anden distribution. Det sker, fordi systemet ikke kan finde biblioteket. Hvorfor kan det ikke findes og indlæses?
Der er flere grunde, men som regel handler det om et bibliotek, der:
Når vi løser problemet, vil vi tage udgangspunkt i disse årsager og forsøge at løse dem.
Lad os nu se på specifikke eksempler på, hvordan man løser dette problem baseret på de årsager, der er nævnt i det foregående afsnit.
Der er ikke noget kompliceret her, og alt er helt klart - biblioteket er simpelthen ikke til stede i systemet, og det er derfor, vi får denne fejl. Derfor er vi nødt til at finde bibliotekspakken ved hjælp af en pakkehåndtering og installere den. Normalt kaldes pakker med biblioteker det samme som selve bibliotekerne med præfikset lib
.
Hvis vi mangler biblioteket libfuse2.so
, kan vi finde det i Ubuntu med denne kommando:
$ sudo apt search libfuse2
Så er der kun tilbage at installere det:
$ sudo apt install libfuse2
Når du skal bygge et program fra kilden, skal du også installere headerfilerne:
$ sudo apt install libfuse-dev
Og det samme gælder for ethvert bibliotek. Men det virker ikke altid.
I praksis er der tilfælde, hvor biblioteket er installeret, men hvor fejlen fortsætter og ikke giver brugerne mulighed for at interagere normalt med systemet. Hvad skal man gøre i sådan et tilfælde? Først og fremmest skal du tjekke Linux boot loader, som ikke kan finde biblioteket. Søgningen skal udføres i de mapper, der er angivet i konfigurationsfilerne /etc/ld.conf.d/
. Som regel er det /usr/lib, /lib, /usr/lib64, /lib64
. Hvis biblioteket er installeret i en anden mappe, er det naturligvis roden til problemet.
Du kan se, hvilke biblioteker der i øjeblikket er tilgængelige for indlæseren ved hjælp af kommandoen:
$ ldconfig -p
Find ud af, hvor dit bibliotek er placeret ved hjælp af kommandoen locate
. Vi er f.eks. interesserede i biblioteket librtfreader.so:
$ locate librtfreader
Når vi kender placeringen af /opt/kingsoft/wps-office/office6/
, skal vi gøre det muligt for loaderen at finde biblioteket. Vi tilføjer stien /etc/ld.so.conf.d/
til konfigurationsfilen eller til variablen LD_LIBRARY_PATH
:
export LD_LIBRARY_PATH=/opt/kingsoft/wps-office/office6/
Du kan installere med et hvilket som helst bibliotek, der påkalder sig fejlen. Du kan også tage den mindre komplicerede vej ved at oprette et symbolsk link til det korrekte bibliotek i den korrekte mappe:
ln -s /opt/kingsoft/wps-office/office6/librtfreader.so /usr/lib/librtfreader.so
Dette sker normalt, når man bruger programmer til en distribution, som man ikke har installeret. Hvert bibliotek har en ekstra version, som skrives efter .so
-udvidelsen. For eksempel libav.so.1.
Versionsnummeret ændres, når et bibliotek patches.
Det sker ofte, at et program i én distribution er bygget med en biblioteksafhængighed, f.eks. libc.so .1
, og i en anden distribution er der kun libc. so.2.
I de fleste tilfælde er forskellene her små, og programmet kan køre på den anden version af biblioteket. Så vi kan bare oprette et symbolsk link til det.
For eksempel er der ikke noget libusb-1.0.so.1-bibliotek
. Men der er libusb-1.0.so.0.1
, og det kan vi bruge:
Det gør vi ved at lave et symbolsk link til biblioteket:
$ sudo ln -s /usr/lib/libusb-1.0.so.0.1 /usr/lib/libusb-1.0.so.1
Ofte vil programmet ikke bemærke udskiftningen og vil fungere. Som en smart løsning kan du prøve at finde den rigtige version af biblioteket på internettet til din arkitektur og placere den i mappen /usr/lib/
eller /usr/lib64/
. Men derefter er det ønskeligt at opdatere cachen:
$ sudo ldconfig
Hvis problemet fortsætter efter disse trin, anbefales det at læse dokumentationen til programmet eller operativsystemet for at få mere detaljerede oplysninger om de nødvendige biblioteksversioner, og hvordan man installerer dem.