Linux gebruikers komen vaak de foutmelding 'fout bij het laden van gedeelde bibliotheken
' tegen bij het uitvoeren van programma's, en het is ook bekend bij veel programmeurs en iedereen die software wil compileren op hun systeem. Letterlijk betekent het dat er een probleem is tijdens het laden van gedeelde bibliotheken.
Fout"fout tijdens laden gedeelde bibliotheken
" betekent dat bij het uitvoeren van een programma of script, het besturingssysteem een of meer bibliotheken die nodig zijn om dit programma te laten werken, niet kon vinden en laden. Dit is een veel voorkomend probleem in UNIX-achtige besturingssystemen. Wanneer een programma wordt gecompileerd, kan het verwijzen naar verschillende externe bibliotheken die beschikbaar zouden moeten zijn tijdens runtime. Als deze bibliotheken ontbreken of niet beschikbaar zijn, treedt er een fout op tijdens het laden van gedeelde bibliotheken.
Zelfs als je je programma's niet compileert, kun je deze foutmelding zien: directory_name: cannot open shared object file: No such file or directory
heel vaak wanneer je nieuwe programma's installeert die niet via de pakketbeheerder lopen of programma's die bedoeld zijn voor een andere distributie. Dit gebeurt omdat het systeem de bibliotheek niet kan vinden. Waarom kan het niet worden gevonden en geladen?
Er zijn verschillende redenen, meestal komt het neer op een bibliotheek die:
Bij het oplossen van het probleem zullen we ons laten leiden door deze redenen en ze proberen op te lossen.
Laten we nu eens kijken naar specifieke voorbeelden van het oplossen van dit probleem op basis van de redenen die in de vorige paragraaf zijn genoemd.
Hier is niets ingewikkelds aan de hand en alles is heel duidelijk - de bibliotheek is gewoon niet aanwezig in het systeem, daarom krijgen we deze foutmelding. Daarom moeten we het bibliotheekpakket vinden met behulp van een pakketbeheerder en het installeren. Gewoonlijk worden pakketten met bibliotheken hetzelfde genoemd als de bibliotheken zelf met het voorvoegsel lib
.
Als we de libfuse2.so
bibliotheek missen, kunnen we deze in Ubuntu vinden met dit commando:
$ sudo apt search libfuse2
Het enige wat we dan nog moeten doen is het installeren:
$ sudo apt install libfuse2
Als je een programma vanaf de broncode moet bouwen, moet je ook de headerbestanden installeren:
$ sudo apt install libfuse-dev
En zo voor elke bibliotheek. Maar dit werkt niet altijd.
In de praktijk zijn er gevallen waarin de bibliotheek is geïnstalleerd, maar de fout blijft bestaan en gebruikers niet in staat stelt om normaal met het systeem te werken. Wat te doen in zo'n geval? Controleer eerst de Linux bootloader die de bibliotheek niet kan vinden. De zoekopdracht moet worden uitgevoerd in de mappen die zijn opgegeven in de configuratiebestanden /etc/ld.conf.d/
. In de regel zijn dit /usr/lib, /lib, /usr/lib64, /lib64
. Als de bibliotheek in een andere map is geïnstalleerd, is dit duidelijk de oorzaak van het probleem.
Je kunt zien welke bibliotheken momenteel beschikbaar zijn voor de loader met het commando:
$ ldconfig -p
Zoek waar je bibliotheek zich bevindt met de opdracht locate
. We zijn bijvoorbeeld geïnteresseerd in de bibliotheek librtfreader.so:
$ locate librtfreader
Als we de locatie van /opt/kingsoft/wps-office/office6/
weten, moeten we ervoor zorgen dat de loader de bibliotheek kan detecteren. We voegen het pad /etc/ld.so.conf.d/
toe aan het configuratiebestand of aan de variabele LD_LIBRARY_PATH
:
export LD_LIBRARY_PATH=/opt/kingsoft/wps-office/office6/
Je kunt installeren met elke bibliotheek die de fout oproept. U kunt ook de minder gecompliceerde route nemen door een symbolische koppeling naar de juiste bibliotheek in de juiste map aan te maken:
ln -s /opt/kingsoft/wps-office/office6/librtfreader.so /usr/lib/librtfreader.so
Dit gebeurt meestal wanneer je programma's gebruikt voor een distributie die je niet geïnstalleerd hebt. Elke bibliotheek heeft een extra versie, die achter de extensie .so
staat. Bijvoorbeeld libav.so.1
. Het versienummer verandert telkens wanneer een bibliotheek wordt gepatcht.
Het komt vaak voor dat in de ene distributie een programma wordt gebouwd met een bibliotheekafhankelijkheid, zoals libc .so.1
, en in een andere distributie is er alleen libc.so.2
. In de meeste gevallen zijn de verschillen hier klein en kan het programma draaien op de tweede versie van de bibliotheek. We kunnen er dus gewoon een symbolische link naar maken.
Er is bijvoorbeeld geen libusb-1.0.so.1
bibliotheek. Maar er is wel libusb-1.0.so.0.1
, en die kunnen we gebruiken:
Om dit te doen, maken we gewoon een symbolische link naar de bibliotheek:
$ sudo ln -s /usr/lib/libusb-1.0.so.0.1 /usr/lib/libusb-1.0.so.1
Vaak zal het programma de vervanging niet opmerken en werken. Een slimme oplossing is om de juiste versie van de bibliotheek op het internet te vinden voor jouw architectuur en deze in de map /usr/lib/
of /usr/lib64/
te plaatsen. Maar daarna is het wenselijk om de cache bij te werken:
$ sudo ldconfig
Als het probleem aanhoudt na deze stappen, is het aan te raden om de documentatie van het programma of besturingssysteem te raadplegen voor meer gedetailleerde informatie over de vereiste bibliotheekversies en hoe deze te installeren.