Per capire cosa sta cercando il linker, eseguilo in modalità dettagliata.
Ad esempio, ho riscontrato questo problema durante il tentativo di compilare MySQL con il supporto ZLIB. Stavo ricevendo un errore come questo durante la compilazione:
/usr/bin/ld: cannot find -lzlib
Ho cercato su Google e ho continuato a imbattermi in diversi problemi dello stesso tipo in cui le persone dicevano di assicurarsi che il file .so esistesse effettivamente e, in caso contrario, creare un collegamento simbolico al file con versione, ad esempio zlib. quindi.1.2.8. Ma, quando ho controllato, zlib.so esisteva. Quindi, ho pensato, sicuramente non poteva essere quello il problema.
Mi sono imbattuto in un altro post su Internet che suggeriva di eseguire make con LD_DEBUG=all:
LD_DEBUG=all make
Anche se ho ricevuto un sacco di output di debug, in realtà non è stato utile. Ha aggiunto più confusione che altro. Quindi, stavo per arrendermi.
Poi, ho avuto un'illuminazione. Ho pensato di controllare effettivamente il testo della guida per il comando ld:
ld --help
Da ciò, ho capito come eseguire ld in modalità dettagliata (immagina che):
ld -lzlib --verbose
Questo è l'output che ho ottenuto:
==================================================
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
Suona, suona, suona...
Quindi, per risolverlo finalmente in modo da poter compilare MySQL con la mia versione di ZLIB (piuttosto che con la versione in bundle):
sudo ln -s /usr/lib/libz.so.1.2.8 /usr/lib/libzlib.so
Voilà!
Se il nome della tua libreria è dì libxyz.so
e si trova sul percorso diciamo:
/home/user/myDir
poi per collegarlo al tuo programma:
g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog
Non sembra esserci alcuna risposta che risolva il problema molto comune dei principianti di non riuscire a installare la libreria richiesta in primo luogo.
Sulle piattaforme Debianish, se libfoo
è mancante, puoi installarlo frequentemente con qualcosa come
apt-get install libfoo-dev
Il -dev
versione del pacchetto è richiesta per il lavoro di sviluppo, anche per il lavoro di sviluppo banale come la compilazione del codice sorgente da collegare alla libreria.
Il nome del pacchetto a volte richiede alcune decorazioni (libfoo0-dev
? foo-dev
senza il lib
prefisso? ecc.), oppure puoi semplicemente usare la ricerca dei pacchetti della tua distribuzione per scoprire con precisione quali pacchetti forniscono un particolare file.
(Se ce n'è più di uno, dovrai scoprire quali sono le loro differenze. Scegliere il più bello o il più popolare è una scorciatoia comune, ma non una procedura accettabile per qualsiasi serio lavoro di sviluppo.)
Per altre architetture (in particolare RPM) si applicano procedure simili, anche se i dettagli saranno diversi.