Estoy tratando de compilar mi programa y me devuelve este error:
usr/bin/ld: cannot find -l<nameOfTheLibrary>
en mi archivo MAKE utilizo el comando g++
y el enlace a mi biblioteca, que es un enlace simbólico a mi biblioteca ubicado en otro directorio.
¿Hay una opción para agregar para que funcione, por favor?
-l
modificador (por ejemplo, libpthread.so ya se está vinculando).Respuestas:
Si el nombre de su biblioteca es decir
libxyz.so
y se encuentra en la ruta, diga:luego para vincularlo a su programa:
fuente
Para averiguar qué está buscando el vinculador, ejecútelo en modo detallado.
Por ejemplo, me encontré con este problema al intentar compilar MySQL con soporte ZLIB. Recibí un error como este durante la compilación:
Busqué en Google y seguí encontrando diferentes problemas del mismo tipo en los que la gente decía para asegurarse de que el archivo .so realmente existe y, si no es así, crear un enlace simbólico al archivo versionado, por ejemplo, zlib. so.1.2.8. Pero, cuando verifiqué, zlib.so 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:
Aunque obtuve una TONELADA de salida de depuración, en realidad no fue útil. Agregó más confusión que cualquier otra cosa. Entonces, estaba a punto de rendirme.
Entonces, tuve una epifanía. Pensé en verificar el texto de ayuda para el comando ld:
A partir de eso, descubrí cómo ejecutar ld en modo detallado (imagine eso):
Este es el resultado que obtuve:
Ding, ding, ding ...
Entonces, para finalmente arreglarlo y poder compilar MySQL con mi propia versión de ZLIB (en lugar de la versión incluida):
Voila!
fuente
-Xlinker --verbose
a los argumentos de la línea de comandos de gcc para que pase esta opción a ld.-Wl,-Bstatic
. Esto limita la búsqueda a archivos .a solamente. La opción detallada mostró esto claramente. Una vez que eliminé-Wl,-Bstatic
las bibliotecas compartidas también se buscaron.-Wl,--verbose
y lo pasa--verbose
al enlazador.-Wl,--verbose
para pasar de forma detallada al enlazador.No parece haber ninguna respuesta que aborde el problema muy común para principiantes de no instalar la biblioteca requerida en primer lugar.
En las plataformas Debianish, si
libfoo
falta, puede instalarlo frecuentemente con algo comoLa
-dev
versión del paquete es necesaria 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 ellib
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, necesitará averiguar cuáles son sus diferencias. Elegir el mejor o el más popular es un atajo común, pero no es un procedimiento aceptable para cualquier trabajo de desarrollo serio).
Para otras arquitecturas (más notablemente RPM) se aplican procedimientos similares, aunque los detalles serán diferentes.
fuente
apt-get install libperl-dev
Lo resolvió para mí. Gracias :)yum install openssl-devel
solución simple .Tiempo de compilación
Cuando g ++ dice
cannot find -l<nameOfTheLibrary>
, significa que g ++ buscó el archivolib{nameOfTheLibrary}.so
, pero no pudo encontrarlo en la ruta de búsqueda de la biblioteca compartida, que por defecto apunta a/usr/lib
y/usr/local/lib
quizás en otro lugar.Para resolver este problema, debe proporcionar el archivo de biblioteca (
lib{nameOfTheLibrary}.so
) en esas rutas de búsqueda o usar la-L
opción de comando.-L{path}
le dice a g ++ (en realidadld
) que busque archivos de biblioteca en la ruta{path}
además de las rutas predeterminadas.Ejemplo: Suponiendo que tiene una biblioteca
/home/taylor/libswift.so
y desea vincular su aplicación a esta biblioteca. En este caso, debe proporcionar el g ++ con las siguientes opciones:Nota 1 : la
-l
opción obtiene el nombre de la biblioteca sinlib
y.so
al principio y al final.Nota 2 : en algunos casos, el nombre del archivo de la biblioteca va seguido de su versión, por ejemplo
libswift.so.1.2
. En estos casos, g ++ tampoco puede encontrar el archivo de biblioteca. Una solución simple para solucionar esto es crear un enlace simbólico alibswift.so.1.2
llamadolibswift.so
.Tiempo de ejecución
Cuando vincula su aplicación a una biblioteca compartida, se requiere que la biblioteca permanezca disponible siempre que ejecute la aplicación. En tiempo de ejecución, su aplicación (en realidad vinculador dinámico) busca sus bibliotecas en
LD_LIBRARY_PATH
. Es una variable de entorno que almacena una lista de rutas.Ejemplo: en el caso de nuestro
libswift.so
ejemplo, el enlazador dinámico no puede encontrarlibswift.so
enLD_LIBRARY_PATH
(que apunta a rutas de búsqueda predeterminadas). Para solucionar el problema, debe agregar esa variable con la rutalibswift.so
.fuente
.so
archivos/usr/lib
, pero me resultó interesante siexport
ayudaría. A pesar del proceso de instalación después demake
continuar por más tiempo, se produjo otro error. Esta vez,.so.0
no se encontró el archivo, pero ambos.so
y el.so.0
archivo estaban en el directorio donde he compilado el paquete dependiente desde la fuente. ¿Podrías ayudar con eso?Durante la compilación con
g++
viamake
defineLIBRARY_PATH
si puede no ser apropiado cambiar el Makefile con la-L
opción. Había puesto mi biblioteca extra,/opt/lib
así que hice:y luego se postuló
make
para una compilación y vinculación exitosa.Para ejecutar el programa con una biblioteca compartida, defina:
antes de ejecutar el programa.
fuente
Primero, debe conocer la regla de denominación de
lxxx
:lc
significalibc.so
,lltdl
significalibltdl.so
,lXtst
significalibXts.so
.Entonces, es
lib
+lib-name
+.so
Una vez que sepamos el nombre, podemos usarlo
locate
para encontrar la ruta de estelxxx.so
archivo.Si no puede encontrarlo, debe instalarlo
yum
(uso CentOS). Por lo general, tiene este archivo, pero no se vincula al lugar correcto.Vincúlelo al lugar correcto, generalmente es
/lib64
o/usr/lib64
$ sudo ln -s /home/user/anaconda3/lib/libiconv.so /usr/lib64/
¡Hecho!
ref: https://i-pogo.blogspot.jp/2010/01/usrbinld-cannot-find-lxxx.html
fuente
locate
solo funciona si está instalado y funcionando regularmente. Una solución alternativa es ejecutarlofind
en todo el disco, pero, por supuesto, llevará tiempo. Si se encuentra haciendo eso con frecuencia, considere instalarlolocate
solo para reducir el costo (interactivo, humano) de esta operación.Cuando compila su programa, debe proporcionar la ruta a la biblioteca; en g ++ use la opción -L:
fuente
ccmake
para queMakefile
se cree con la bandera vinculada? Quiero vincular mi-lARToolkitPlus
bandera a un camino.Este error también puede producirse si el enlace simbólico es a una biblioteca dinámica, .so, pero por razones heredadas
-static
aparece entre los indicadores de enlace. Si es así, intente eliminarlo.fuente
Verifique la ubicación de su biblioteca, por ejemplo lxxx.so:
Si no está en la
/usr/lib
carpeta, escriba esto:Hecho.
fuente
Además de las respuestas ya dadas, también puede darse el caso de que el archivo * .so exista pero no tenga un nombre adecuado. O puede ser que el archivo * .so exista pero que sea propiedad de otro usuario / root.
Problema 1: nombre incorrecto
Si está vinculando el archivo,
-l<nameOfLibrary>
entonces el nombre del archivo de la biblioteca DEBE tener la forma.lib<nameOfLibrary>
Si solo tiene un<nameOfLibrary>.so
archivo, cámbiele el nombre.Problema 2: propietario incorrecto
Para verificar que este no sea el problema, haga
Si el archivo es propiedad de root u otro usuario, debe hacerlo
fuente
La biblioteca a la que intentaba vincular resultó tener un nombre no estándar (es decir, no tenía el prefijo 'lib'), por lo que me recomendaron usar un comando como este para compilarlo:
gcc test.c -Iinclude lib/cspice.a -lm
fuente
Aquí está la información de Ubuntu de mi computadora portátil.
Utilizo localizar para encontrar los archivos .so para boost_filesystem y boost_system
Luego vincule los archivos .so a / usr / lib y cambie el nombre a .so
¡Hecho! El paquete R velocyto.R se instaló correctamente.
fuente
Encontré el mismo mensaje de error.
Construí el
cmocka
como aso
e intenté vincularlo a mi ejecutable. Perold
siempre se queja a continuación:Resulta que hay 3 archivos generados después de que
cmocka
se genera :1 y 2 son enlaces de símbolos y solo 3 es el archivo real.
Solo copié el 1 en la carpeta de mi biblioteca, donde
ld
no pude encontrar el 3.Después de copiar los 3,
ld
funciona.fuente