Bandau kompiliuoti savo programą ir ji grąžina šią klaidą:
usr/bin/ld: cannot find -l<nameOfTheLibrary>
savo makefile naudoju komandą g++
ir nuorodą į savo biblioteką, kuri yra simbolinė nuoroda į mano biblioteką, esančią kitame kataloge.
Ar galima pridėti kokią nors parinktį, kad tai veiktų, prašau?
Jei norite sužinoti, ko ieško susiejimo programa, paleiskite ją verbaliniu režimu.
Pavyzdžiui, su šia problema susidūriau bandydamas kompiliuoti "MySQL" su ZLIB palaikymu. Kompiliavimo metu gaudavau tokią klaidą:
/usr/bin/ld: cannot find -lzlib
Šiek tiek paieškojau "Googl'inėje ir vis susidurdavau su įvairiomis panašaus pobūdžio problemomis, kur žmonės sakydavo, kad reikia įsitikinti, jog failas
Internete radau kitą pranešimą, kuriame siūloma paleisti make su LD_DEBUG=all:
LD_DEBUG=all make
Nors ir gavau daugybę derinimo išvesties, ji iš tikrųjų nebuvo naudinga. Tai įnešė daugiau painiavos nei ko nors kito. Todėl ketinau pasiduoti.
Tuomet man nušvito. Pagalvojau, kad reikia patikrinti ld komandos pagalbos tekstą:
ld --help
Iš to supratau, kaip paleisti ld verbaliniu režimu (įsivaizduokite):
ld -lzlib --verbose
Štai kokią išvestį gavau:
==================================================
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...
Taigi, kad galiausiai jį ištaisyčiau ir galėčiau kompiliuoti "MySQL" naudodamas savo ZLIB versiją (o ne komplektuojamą versiją):
sudo ln -s /usr/lib/libz.so.1.2.8 /usr/lib/libzlib.so
Voila!
Jei jūsų bibliotekos pavadinimas yra, tarkime, libxyz.so
ir ji yra, tarkime, kelyje:
/home/user/myDir
tada, norėdami ją susieti su savo programa:
g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog