Linux-fout tijdens het laden van gedeelde bibliotheken: kan het gedeelde objectbestand niet openen: geen dergelijk bestand of map

Het programma maakt deel uit van de Xenomai-testsuite, gecompileerd van Linux-pc naar Linux+Xenomai ARM-toolchain.

# echo $LD_LIBRARY_PATH                                                                                                                                          
/lib                                                                                                                                                             
# ls /lib                                                                                                                                                        
ld-2.3.3.so         libdl-2.3.3.so      libpthread-0.10.so                                                                                                       
ld-linux.so.2       libdl.so.2          libpthread.so.0                                                                                                          
libc-2.3.3.so       libgcc_s.so         libpthread_rt.so                                                                                                         
libc.so.6           libgcc_s.so.1       libstdc++.so.6                                                                                                           
libcrypt-2.3.3.so   libm-2.3.3.so       libstdc++.so.6.0.9                                                                                                       
libcrypt.so.1       libm.so.6                                                                                                                                    
# ./clocktest                                                                                                                                                    
./clocktest: error while loading shared libraries: libpthread_rt.so.1: cannot open shared object file: No such file or directory                                 

EDIT: OK Ik merkte niet dat de .1 aan het einde deel uitmaakte van de bestandsnaam. Wat betekent dat toch?


Antwoord 1, Autoriteit 100%

update
Hoewel wat ik hieronder schrijf, is het waar als algemeen antwoord over gedeelde bibliotheken, ik denk dat de meest voorkomende oorzaak van dit soort bericht is, is omdat u een pakket hebt geïnstalleerd, maar niet de “-dev” -versie van dat pakket hebt geïnstalleerd.


Nou, het is niet liegen – er is geen libpthread_rt.so.1in die aanbieding. U hoeft deze waarschijnlijk opnieuw te configureren en opnieuw te bouwen, zodat het afhangt van de bibliotheek die u hebt, of installeert alles wat biedt libpthread_rt.so.1.

Over het algemeen zijn de nummers na de .so versnummers, en zul je vaak ontdekken dat ze symlinks naar elkaar zijn, dus als je versie 1.1 van libfoo hebt, heb je een echt bestand libfoo. .1.0 en symlinks foo.so en foo.so.1 wijzend naar de libfoo.so.1.0. En als u versie 1.1 installeert zonder de andere te verwijderen, heeft u een libfoo.so.1.1, en libfoo.so.1 en libfoo.so zal nu wijzen op de nieuwe, maar elke code die vereist is Gebruik het bestand Libfoo.so.0.0. Code die net op de versie 1 API vertrouwt, maar maakt het niet uit of het 1,0 of 1.1 is, Libfoo.so.1 opgeven. Zoals ORIP wees in de opmerkingen, dit wordt goed uitgelegd op http://tldp.org/howto/program-library-howto/shared-libraries.html .

In uw geval kunt u weggaan met symlinking libpthread_rt.so.1naar libpthread_rt.so. Geen garanties dat het uw code niet zal breken en uw tv-diners opeten.


Antwoord 2, Autoriteit 268%

Uw bibliotheek is een dynamische bibliotheek.
U moet het besturingssysteem vertellen waar het op looptijd kan vinden.

om dit te doen,
We moeten die eenvoudige stappen doen:

(1) Zoek waar de bibliotheek is geplaatst als u het niet weet.

sudo find / -name the_name_of_the_file.so

(2) Controleer op het bestaan ​​van de dynamische bibliotheekpadomgeving variabele (LD_LIBRARY_PATH)

$ echo $LD_LIBRARY_PATH

Als er niets te weergeven is, voegt u een standaard padwaarde toe (of niet als u wilt)

$ LD_LIBRARY_PATH=/usr/local/lib

(3) We voegen het verlangenpad toe, exporteren en proberen de toepassing.

Merk op dat het pad de map moet zijn waar de path.so.somethingis.
Dus als path.so.somethingis in /my_library/path.so.somethinghet zou moeten zijn:

$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_library/
$ export LD_LIBRARY_PATH
$ ./my_app

Bron: https: //www.gnu. Org / Software / GSL / DOC / HTML / Usage.html # Gedeelde-bibliotheken


Antwoord 3, Autoriteit 128%

Hier zijn een paar oplossingen die u kunt proberen:

LDCONFIG

Zoals Abiusx opmerkte: als u nu net de bibliotheek hebt geïnstalleerd, moet u eenvoudig uitvoeren ldconfig .

sudo ldconfig

LDCONFIG maakt de benodigde links en cache naar de meest recente
gedeelde bibliotheken gevonden in de mappen gespecificeerd op de opdracht
regel, in het bestand /etc/ld.so.conf, en in de vertrouwde mappen
(/lib en /usr/lib).

Gewoonlijk zorgt uw pakketbeheerder hiervoor wanneer u een nieuwe bibliotheek installeert, maar niet altijd, en het kan geen kwaad om ldconfig uit te voeren, zelfs als dat niet uw probleem is.

Ontwikkelingspakket of verkeerde versie

Als dat niet werkt, zou ik ook de suggestie van Paulbekijken en een “-dev”-versie zoeken van de bibliotheek. Veel bibliotheken zijn opgesplitst in dev- en niet-dev-pakketten. U kunt deze opdracht gebruiken om ernaar te zoeken:

apt-cache search <libraryname>

Dit kan ook helpen als je gewoon de verkeerde versie van de bibliotheek hebt geïnstalleerd. Sommige bibliotheken worden tegelijkertijd in verschillende versies gepubliceerd, bijvoorbeeld Python.

Bibliotheeklocatie

Als je zeker weet dat het juiste pakket is geïnstalleerd en ldconfig het niet heeft gevonden, staat het misschien in een niet-standaard directory. Standaard zoekt ldconfig in /lib, /usr/liben mappen die worden vermeld in /etc/ld.so.confen $LD_LIBRARY_PATH. Als uw bibliotheek zich ergens anders bevindt, kunt u de map op zijn eigen regel toevoegen in /etc/ld.so.conf, het pad van de bibliotheek toevoegen aan $LD_LIBRARY_PATH, of verplaats de bibliotheek naar /usr/lib. Voer vervolgens ldconfiguit.

Probeer het volgende om erachter te komen waar de bibliotheek is:

sudo find / -iname *libraryname*.so*

(Vervang librarynamedoor de naam van uw bibliotheek)

Als je de route $LD_LIBRARY_PATHvolgt, moet je dat in je bestand ~/.bashrczetten, zodat het elke keer dat je inlogt wordt uitgevoerd:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/library

Antwoord 4, autoriteit 23%

U moet ervoor zorgen dat u het bibliotheekpad specificeert tijdens
koppelen wanneer u uw .c-bestand compileert:

gcc -I/usr/local/include xxx.c -o xxx -L/usr/local/lib -Wl,-R/usr/local/lib

Het -Wl,-Rdeel vertelt het resulterende binaire bestand om ook naar de bibliotheek te zoeken
in /usr/local/libtijdens runtime voordat u die in /usr/lib/probeert te gebruiken.


Antwoord 5, autoriteit 18%

Probeer LD_LIBRARY_PATH, dat zoekpaden aangeeft, toe te voegen aan uw ~/.bashrc-bestand

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path_to_your_library

Het werkt!


Antwoord 6, autoriteit 9%

De referentiepagina van linux.org legt de mechanica uit, maar legt niets uit van de motivatie erachter 🙁

Zie daarvoor de Sun Linker and Libraries Guide

Bovendien moet u er rekening mee houden dat “externe versiebeheer” grotendeels achterhaald is op Linux, omdat symboolversiebeheer (een GNU-extensie) u in staat stelt meerdere incompatibele versies van dezelfde functie in een enkele bibliotheek aanwezig te hebben. Met deze extensie kon glibc de afgelopen 10 jaar dezelfde externe versie hebben: libc.so.6.


Antwoord 7, autoriteit 5%

cd /home/<user_name>/
sudo vi .bash_profile

voeg deze regels aan het einde toe

LD_LIBRARY_PATH=/usr/local/lib:<any other paths you want>
export LD_LIBRARY_PATH

Antwoord 8, autoriteit 4%

Ik had een soortgelijke fout en deze werd niet opgelost door LD_LIBRARY_PATH op te geven in ~/.bashrc .
Wat mijn probleem heeft opgelost, is door het .conf-bestand toe te voegen en te laden.
Ga naar terminal en be in su.

gedit /etc/ld.so.conf.d/myapp.conf

Voeg je bibliotheekpad toe aan dit bestand en sla het op (bijvoorbeeld: /usr/local/lib).
U moet de volgende opdracht uitvoeren om het pad te activeren:

ldconfig

Verifieer uw nieuwe bibliotheekpad:

ldconfig -v | less

Als dit je bibliotheekbestanden toont, ben je klaar om te gaan.


Antwoord 9, autoriteit 3%

Een andere mogelijke oplossing, afhankelijk van uw situatie.

Als je weet dat libpthread_rt.so.1 hetzelfde is als libpthread_rt.so, dan kun je een symbolische link maken door:

ln -s /lib/libpthread_rt.so /lib/libpthread_rt.so.1

Dan zou ls -l /libnu de symbolische link moeten tonen en waar deze naar verwijst.


Antwoord 10, autoriteit 3%

Ik had deze fout bij het uitvoeren van mijn applicatie met Eclipse CDT op Linux x86.
Om dit op te lossen:

  1. In Eclipse:

    Uitvoeren als -> Configuraties uitvoeren -> Omgeving

  2. Stel het pad in

    LD_LIBRARY_PATH=/my_lib_directory_path
    

Antwoord 11

probeer sudo lib32z1 te installeren

sudo apt-get install lib32z1


Antwoord 12

Het enige wat ik hoefde te doen was rennen:

sudo apt-get install libfontconfig1

Ik bevond me in de map op /usr/lib/x86_64-linux-gnuen het werkte perfect.


Antwoord 13

Als u uw toepassing op Microsoft Windows uitvoert, moet het pad naar dynamische bibliotheken (.dll) worden gedefinieerd in de omgevingsvariabele PATH.

Als u uw toepassing op UNIX uitvoert, moet het pad naar uw dynamische bibliotheken (.so) worden gedefinieerd in de omgevingsvariabele LD_LIBRARY_PATH.


Antwoord 14

De fout treedt op omdat het systeem niet kan verwijzen naar het genoemde bibliotheekbestand. Voer de volgende stappen uit:

  1. Als u locate libpthread_rt.so.1uitvoert, wordt het pad weergegeven van alle bestanden met die naam. Laten we aannemen dat een pad /home/user/locis.
  2. Kopieer het pad en voer cd home/USERNAMEuit. Vervang GEBRUIKERSNAAM door de naam van de huidige actieve gebruiker waarmee u het bestand wilt uitvoeren.
  3. Voer vi .bash_profileuit en voeg aan het einde van de parameter LD_LIBRARY_PATH, net voor .de regel /lib://home/usr/loc:.. Sla het bestand op.
  4. Sluit terminal en start de applicatie opnieuw. Het zou moeten werken.

Antwoord 15

Ik gebruik Ubuntu 18.04

Het installeren van het corresponderende “-dev” pakket werkte voor mij,

sudo apt install libgconf2-dev

Ik kreeg de onderstaande foutmelding totdat ik het bovenstaande pakket installeerde,

turtl: error while loading shared libraries: libgconf-2.so.4: cannot open shared object file: No such file or directory

Antwoord 16

Ik kreeg deze foutmelding en ik denk dat het dezelfde reden is voor jou

error while loading shared libraries: libnw.so: cannot open shared object 
file: No such file or directory

Probeer dit eens. Permissies corrigerenvoor bestanden:

cd /opt/Popcorn (or wherever it is) 
chmod -R 555 * (755 if not ok) 
chown -R root:root *

“sudo su” om permissies op je bestandssysteem te krijgen.


Antwoord 17

Ik kreeg deze foutmelding en ik denk dat het dezelfde reden is als die van jou

fout bij het laden van gedeelde bibliotheken: libnw.so: kan gedeelde bibliotheken niet openen
objectbestand: geen dergelijk bestand of map

Probeer dit eens. Rechten op bestanden corrigeren:

cd /opt/Popcorn (or wherever it is) 
chmod -R 555 * (755 if not ok) 

Antwoord 18

vergelijkbaar probleem hier gevonden: https://bugzilla.redhat.com/show_bug. cgi?id=1456202
Ik heb de genoemde oplossing geprobeerd en het werkt echt.

De oplossingen in de vorige vragen kunnen werken. Maar ik denk dat dit een makkelijke manier is om het op te lossen.
Probeer het pakket libwbclientopnieuw te installeren
in fedora:

dnf reinstall libwbclient

Antwoord 19

Wil je toevoegen, als je bibliotheken zich in een niet-standaard pad bevinden, voer dan ldconfiguit gevolgd door het pad.

Ik moest bijvoorbeeld uitvoeren:

sudo ldconfig /opt/intel/oneapi/mkl/2021.2.0/lib/intel64

om R te laten compileren tegen Intel MKL

Other episodes