Chcete-li zjistit, co linker hledá, spusťte jej v podrobném režimu.
S tímto problémem jsem se například setkal při pokusu o kompilaci MySQL s podporou ZLIB. Během kompilace se mi zobrazila podobná chyba:
/usr/bin/ld: cannot find -lzlib
Provedl jsem nějaké googlování a neustále jsem narážel na různé problémy stejného druhu, kde lidé říkali, aby se ujistili, že soubor .so skutečně existuje, a pokud ne, vytvořte symbolický odkaz na soubor s verzí, například zlib. takže.1.2.8. Ale když jsem to zkontroloval, zlib.so existoval. Tak jsem si říkal, že to určitě nemůže být problém.
Na internetu jsem narazil na další příspěvek, který navrhoval spustit make s LD_DEBUG=all:
LD_DEBUG=all make
I když jsem dostal TUNU ladicích výstupů, ve skutečnosti to nebylo užitečné. Přidalo to více zmatku než cokoli jiného. Takže jsem to chtěl vzdát.
Pak jsem měl zjevení. Myslel jsem, že skutečně zkontroluji text nápovědy pro příkaz ld:
ld --help
Z toho jsem přišel na to, jak spustit ld v podrobném režimu (představte si to):
ld -lzlib --verbose
Toto je výstup, který jsem dostal:
==================================================
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
Tup, ding, ding...
Abych to konečně opravil, abych mohl zkompilovat MySQL s vlastní verzí ZLIB (spíše než s přibalenou verzí):
sudo ln -s /usr/lib/libz.so.1.2.8 /usr/lib/libzlib.so
Voila!
Pokud je název vaší knihovny, řekněte libxyz.so
a nachází se na cestě, řekněme:
/home/user/myDir
pak jej propojit s vaším programem:
g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog
Zdá se, že neexistuje žádná odpověď, která by řešila velmi častý začátečnický problém, kdy se nepodařilo nainstalovat požadovanou knihovnu.
Na platformách Debianish, pokud libfoo
chybí, můžete jej často nainstalovat pomocí něčeho jako
apt-get install libfoo-dev
-dev
verze balíčku je vyžadována pro vývojovou práci, dokonce i pro triviální vývojovou práci, jako je kompilace zdrojového kódu pro propojení s knihovnou.
Název balíčku bude někdy vyžadovat nějaké dekorace (libfoo0-dev
? foo-dev
bez lib
předpona? atd.), nebo můžete jednoduše použít vyhledávání balíčků vašeho distribuce, abyste přesně zjistili, které balíčky poskytují konkrétní soubor.
(Pokud je jich více, budete muset zjistit, jaké jsou mezi nimi rozdíly. Výběr toho nejlepšího nebo nejoblíbenějšího je běžná zkratka, ale není to přijatelný postup pro jakoukoli seriózní vývojovou práci.)
Pro jiné architektury (zejména RPM) platí podobné postupy, i když podrobnosti se budou lišit.