Am'm încercarea de a compila programul meu și returnează această eroare :
usr/bin/ld: cannot find -l<nameOfTheLibrary>
în makefile am folosi comanda g++
și link-ul de la biblioteca mea, care este o legătură simbolică la biblioteca mea situat pe un alt director.
Există o opțiune pentru a adăuga pentru a face să funcționeze, vă rog?
Să-mi dau seama ce linker-ul este în căutarea pentru, rula în modul verbose.
De exemplu, am întâlnit această problemă în timp ce încerca pentru a compila MySQL cu ZLIB sprijin. Am primit o eroare de genul acesta în timpul compilării:
/usr/bin/ld: cannot find -lzlib
Am făcut niște Googl'ing și veneau pe diferite probleme de același tip în cazul în care oamenii ar spune să asigurați-vă că
Am dat peste un alt post de pe Internet, care a sugerat să ruleze face cu LD_DEBUG=toate:
LD_DEBUG=all make
Deși am o GRĂMADĂ de depanare, nu a fost't, de fapt util. Acesta a adăugat și mai multă confuzie decât orice altceva. Deci, am fost pe cale să renunțe.
Apoi, am avut o revelație. Am crezut că pentru a verifica de fapt, textul de ajutor pentru ld comanda:
ld --help
De aceea, mi-am dat seama cum de a rula ld în modul verbose (imaginați-vă că):
ld -lzlib --verbose
Aceasta este cea de ieșire trebuie:
==================================================
attempt to open /usr/x86_64-linux-gnu/lib64/libzlib.so failed
attempt to open /usr/x86_64-linux-gnu/lib64/libzlib.a failed
attempt to open /usr/local/lib64/libzlib.so failed
attempt to open /usr/local/lib64/libzlib.a failed
attempt to open /lib64/libzlib.so failed
attempt to open /lib64/libzlib.a failed
attempt to open /usr/lib64/libzlib.so failed
attempt to open /usr/lib64/libzlib.a failed
attempt to open /usr/x86_64-linux-gnu/lib/libzlib.so failed
attempt to open /usr/x86_64-linux-gnu/lib/libzlib.a failed
attempt to open /usr/local/lib/libzlib.so failed
attempt to open /usr/local/lib/libzlib.a failed
attempt to open /lib/libzlib.so failed
attempt to open /lib/libzlib.a failed
attempt to open /usr/lib/libzlib.so failed
attempt to open /usr/lib/libzlib.a failed
/usr/bin/ld.bfd.real: cannot find -lzlib
Ding, ding, ding...
Deci, pentru a rezolva în cele din urmă, așa că am putea compila MySQL cu propria mea versiune de ZLIB (mai degrabă decât versiunea pachet):
sudo ln -s /usr/lib/libz.so.1.2.8 /usr/lib/libzlib.so
Voila!
Dacă numele bibliotecii este spus `libxyz.așa și este situat pe calea spun:
/home/user/myDir
apoi, la link-ul acesta pentru programul:
g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog
Acolo nu pare a fi nici un răspuns care se adresează foarte des întâlnită la începători problema de a nu instala bibliotecă necesară, în primul rând.
Pe Debianish platforme, dacă libfoo
lipsește, puteți frecvent instalați-l cu ceva de genul
apt-get install libfoo-dev
A -dev
versiune a pachetului este necesară pentru lucrările de dezvoltare, chiar banal munca de dezvoltare, cum ar fi compilarea codului sursă la link-ul de la bibliotecă.
Pachetul nume va necesita uneori unele decoratiuni (libfoo0-dev
? foo-dev
fără " lib " prefix? etc), sau puteți pur și simplu utilizați distro's pachet search pentru a afla exact care pachete oferi un anumit fișier.
(Dacă există mai mult de unul, veți avea nevoie pentru a afla ce diferențele lor sunt. Alegerea cel mai tare sau cel mai popular este o comună de comenzi rapide, dar nu o procedură acceptabilă pentru orice o muncă serioasă de dezvoltare.)
Pentru alte arhitecturi (mai ales RPM) proceduri similare se aplică, deși detaliile vor fi diferite.
Când g++ spune nu pot găsi -l<nameOfTheLibrary>
, aceasta înseamnă că g++ căutat fișierul lib{nameOfTheLibrary}.deci
, dar nu putea't găsi în bibliotecă partajată calea de căutare, care în mod implicit punctele a /usr/lib " și " /usr/local/lib
și în altă parte.poate.
Pentru a rezolva această problemă, ar trebui să fie furnizați un fișier bibliotecă (lib{nameOfTheLibrary}.deci
) în acele căi de căutare sau de a folosi "- L " comanda opțiune. -L{path}
spune g++ (de fapt ld
) pentru a găsi fișiere bibliotecă în calea `{path} în plus față de căi implicit.
Exemplu: Presupunând că ai o bibliotecă la `/home/taylor/libswift.deci, și tu vrei să-link-ul app la această bibliotecă. În acest caz, ar trebui să furnizeze g++ cu următoarele opțiuni:
g++ main.cpp -o main -L/home/taylor -lswift
Notă 1: -l
opțiune devine numele bibliotecii fără `lib "și".deci, la început și sfârșit.
Notă 2: În unele cazuri, fișierul bibliotecă numele este urmat de versiunea sa, de exemplu libswift.deci.1.2
. În aceste cazuri, g++, de asemenea, nu poate găsi fișierul bibliotecă. O soluție simplă pentru a rezolva acest lucru este de a crea o legătură simbolică a libswift.deci.1.2 "numit" libswift.deci
.
Atunci când link-ul app la o bibliotecă partajată, l's necesar ca biblioteca va rămâne disponibil ori de câte ori rula aplicația. În execuție aplicația dvs. (de fapt, dinamic linker) arată pentru biblioteci în LD_LIBRARY_PATH
. L's o variabilă de mediu care stochează o listă de căi.
Exemplu: În cazul nostru libswift.așa de exemplu, linker-ul dinamic nu poate găsi libswift.atât de " în " LD_LIBRARY_PATH
(ceea ce indică implicit căi de căutare). Pentru a rezolva problema trebuie să adăugați variabila cu calea `libswift.așa este în.
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/taylor
În timpul compilării cu g++prin "a face" defini
LIBRARY_PATHdacă nu pot fi adecvate pentru a schimba Makefile cu
-L'option. Am pus my extra bibliotecă în/opt/lib` și așa am făcut:
$ export LIBRARY_PATH=/opt/lib/
și apoi a fugit de "a face" pentru compilatie de succes și de legătură.
Pentru a rula programul cu o bibliotecă partajată defini:
$ export LD_LIBRARY_PATH=/opt/lib/
înainte de a executa programul.
În primul rând, trebuie să știți denumirea statului de lxxx
:
/usr/bin/ld: cannot find -lc
/usr/bin/ld: cannot find -lltdl
/usr/bin/ld: cannot find -lXtst
lc
înseamnă libc.deci
, lltdl "înseamnă" libltdl.deci
, lXtst "înseamnă" libXts.deci
.
Deci, este lib
+ lib-numele
+ .deci,
Odată ce știm numele, putem folosi "localiza" pentru a găsi calea de lxxx.atât de fișier.
$ locate libiconv.so
/home/user/anaconda3/lib/libiconv.so # <-- right here
/home/user/anaconda3/lib/libiconv.so.2
/home/user/anaconda3/lib/libiconv.so.2.5.1
/home/user/anaconda3/lib/preloadable_libiconv.so
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/libiconv.so
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/libiconv.so.2
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/libiconv.so.2.5.1
/home/user/anaconda3/pkgs/libiconv-1.14-0/lib/preloadable_libiconv.so
Dacă nu puteți găsi, aveți nevoie să-l instalați de " yum " (eu folosesc CentOS). De obicei acest fișier, dar nu se leagă la locul potrivit.
Link-ul la locul potrivit, de obicei, este /lib64 " sau " /usr/lib64
$ sudo ln-s /home/user/anaconda3/lib/libiconv.deci /usr/lib64/
Done!
ref: https://i-pogo.blogspot.jp/2010/01/usrbinld-cannot-find-lxxx.html
În afară de răspunsurile deja date, acesta poate fi, de asemenea, în cazul în care .deci, fișierul există, dar nu este numit în mod corespunzător. Sau acesta poate fi cazul în care .deci, fișierul există, dar este deținută de către un alt utilizator / root.
Problema 1: Necorespunzătoare numele
Dacă sunteți de legătură la fișier ca -l<nameOfLibrary>
apoi, nume de fișier de bibliotecă TREBUIE să fie de forma lib<nameOfLibrary>
Dacă aveți doar `
Problema 2: Greșit proprietar
Pentru a verifica dacă acest lucru nu este o problemă - nu
ls -l /path/to/.so/file
Dacă fișierul este deținută de rădăcină sau de un alt utilizator, aveți nevoie pentru a face
sudo chown yourUserName:yourUserName /path/to/.so/file
Biblioteca, am fost încercarea de a link-ul de la s-a dovedit a fi un non-standard de nume (de exemplu, a fost't prefixate cu 'lib'), asa ca recomandat utilizând o comandă ca aceasta să-l compilați -
gcc test.c -Iinclude lib/cspice.un -lm
Aici este Ubuntu informații de laptop-ul meu.
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.2 LTS
Release: 18.04
Codename: bionic
Eu folosesc localiza pentru a găsi .deci, fișiere pentru boost_filesystem și boost_system
locate libboost_filesystem
locate libboost_system
Apoi link-ul .deci, fișierele din /usr/lib și redenumiți-a .deci
sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.65.1 /usr/lib/libboost_filesystem.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 /usr/lib/libboost_system.so
Done! Pachet R velocyto.R a fost instalat cu succes!