Para averiguar qué está buscando el enlazador, ejecútelo en modo detallado.
Por ejemplo, encontré este problema al intentar compilar MySQL con soporte ZLIB. Recibí un error como este durante la compilación:
/usr/bin/ld: cannot find -lzlib
Busqué en Google y seguí encontrando diferentes problemas del mismo tipo en los que la gente decía que se asegurara de que el archivo .so realmente existe y, si no existe, cree un enlace simbólico al archivo versionado, por ejemplo, zlib. so.1.2.8. Pero, cuando revisé, zlib.so SÍ existía. Entonces, pensé, seguramente ese no podría ser el problema.
Encontré otra publicación en Internet que sugería ejecutar make con LD_DEBUG=all:
LD_DEBUG=all make
Aunque obtuve una TONELADA de resultados de depuración, en realidad no fue útil. Añadía más confusión que otra cosa. Entonces, estaba a punto de rendirme.
Entonces, tuve una epifanía. Pensé en revisar el texto de ayuda para el comando ld:
ld --help
A partir de eso, descubrí cómo ejecutar ld en modo detallado (imagínate eso):
ld -lzlib --verbose
Este es el resultado que obtuve:
==================================================
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...
Entonces, para arreglarlo finalmente y poder compilar MySQL con mi propia versión de ZLIB (en lugar de la versión incluida):
sudo ln -s /usr/lib/libz.so.1.2.8 /usr/lib/libzlib.so
¡Voilá!
Si el nombre de su biblioteca es libxyz.so
y se encuentra en la ruta, diga:
/home/user/myDir
luego para vincularlo a su programa:
g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog
No parece haber ninguna respuesta que aborde el problema muy común de los principiantes de no poder instalar la biblioteca requerida en primer lugar.
En plataformas Debianish, si libfoo
falta, puede instalarlo con frecuencia con algo como
apt-get install libfoo-dev
El -dev
Se requiere la versión del paquete para el trabajo de desarrollo, incluso el trabajo de desarrollo trivial, como compilar el código fuente para vincular a la biblioteca.
El nombre del paquete a veces requerirá algunas decoraciones (libfoo0-dev
? foo-dev
sin el lib
¿prefijo? etc.), o simplemente puede usar la búsqueda de paquetes de su distribución para averiguar con precisión qué paquetes proporcionan un archivo en particular.
(Si hay más de uno, deberá averiguar cuáles son sus diferencias. Elegir el más genial o el más popular es un atajo común, pero no es un procedimiento aceptable para ningún trabajo de desarrollo serio).
Para otras arquitecturas (sobre todo RPM) se aplican procedimientos similares, aunque los detalles serán diferentes.