Estoy tratando de compilar mi programa y devuelve este error :

usr/bin/ld: cannot find -l<nameOfTheLibrary>

en mi makefile puedo usar el comando g++ y el enlace a mi biblioteca, que es un enlace simbólico a mi biblioteca ubicada en otro directorio.

Hay una opción para agregar a hacer que funcione por favor?

  • Necesito más información. Qué comando se hizo problema para compilar su programa? Puedes usar make -n su objetivo para hacer solo escriba los comandos normalmente invocar
  • Post el makefile o en el comando ejecutar.
  • mi mandamiento es este : g++ -<opciones> objetc1.o objetc2.o objetc3.o objetc4.o-L<pathOfTheLibrary> -l<nameOfTheLibrary> -lpthread -o myexe
  • Es la biblioteca a la que desea vincular con construido con la misma arquitectura(por ejemplo. 32/64 bits)? Es la biblioteca a la que desea vincular con una biblioteca personalizada? El nombre de la biblioteca de asuntos, ya que tiene que empezar con lib<nombre> cuando se utiliza el -l interruptor (por ejemplo. libpthread.así que ya están vinculación con).
  • El problema estaba en mi enlace simbólico en la biblioteca que no era bueno ! Gracias por su ayuda !
  • Como u es decir, una respuesta a continuación ha resuelto ur problema, así que acepte la respuesta.
  • Hecho ! 😉 Gracias.
  • sólo a la segunda @OrtwinAngermeier comentario acerca de la biblioteca de convenciones de nomenclatura: stackoverflow.com/questions/6561273/…
  • En Debian / Ubuntu Linux intentar apt búsqueda nameoflib por lo que recibirá el nombre exacto de lo que usted desea instalar

InformationsquelleAutor ZoOo | 2013-05-23

12 Comentarios

  1. 168

    Si su nombre de la biblioteca es decir libxyz.so y se encuentra en la ruta de decir:

    /home/user/myDir

    a continuación, vincular a su programa:

    g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog
    • mi biblioteca no es uno dinámico (.así), pero en estático (.a). ¿El problema viene de que?
    • que no debería normalmente la materia, el enlazador puede trabajar con cualquiera de ellos
    • otra forma de enlace de la biblioteca es que se puede especificar directamente el nombre de la biblioteca con la ruta completa, como g++ .. /ruta/mylib.un
    • Sí, pero todavía no funciona. Mi biblioteca es un enlace simbólico, creo que el problema, porque cuando yo uso la librería en el directorio funciona !
    • Yo también directamente el nombre de la biblioteca y no funciona !
    • Es su enlace simbólico apuntando correctamente a la biblioteca en la ubicación real??. puedes publicar la salida de la «ll» en el enlace simbólico.
    • Estás en lo cierto ! Gracias por tu ayuda @SaurabhBhola mi enlace simbólico apuntando en la biblioteca en el otro directorio no era bueno ! Puedo corregirlo y ahora funciona !!! Gracias a todos ustedes !
    • me alegro de que haya funcionado 🙂
    • ¿Cómo puedo añadir el enlace a un archivo?
    • Usted necesidad de poner -lxyz después myprog.cpp desde el vinculador sólo resolver los símbolos para los archivos de objeto a la izquierda en la línea de comandos.

  2. 402

    De averiguar lo que el enlazador busca, ejecutarlo en modo detallado.

    Por ejemplo, me he encontrado con este problema, mientras que tratando de compilar MySQL con SOPORTE de apoyo. Yo estaba recibiendo un error como este durante la compilación:

    /usr/bin/ld: cannot find -lzlib

    Hice algunas Googl ing y venía a través de los diferentes problemas de la misma especie, donde la gente diría que para asegurarse de que el .así que archivo existe y si no, a continuación, crear un enlace simbólico al fichero versionado, por ejemplo, zlib.así.1.2.8. Pero, cuando me registré, zlib.así que no existía. Así, pensé, seguramente, que no podía ser el problema.

    Me encontré con otro post en la web del congreso, lo que sugirió a ejecutar hacer con LD_DEBUG=todos:

    LD_DEBUG=all make

    Aunque tengo una TONELADA de salida de depuración, no era realmente útil. Añadió más confusión que otra cosa. Así que, yo estaba a punto de rendirse.

    Entonces, tuve una epifanía. Pensé para revisar el texto de ayuda para el comando ld:

    ld --help

    De eso, me di cuenta de cómo ejecutar ld en modo verbose (imagino que):

    ld -lzlib --verbose

    Esta es la salida que tengo:

    ==================================================
    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…

    Así, para finalmente solucionarlo para que yo pudiera compilar MySQL con mi propia versión de ZLIB (en lugar de los paquetes de la versión):

    sudo ln -s /usr/lib/libz.so.1.2.8 /usr/lib/libzlib.so

    Voila!

    • Gracias, fue muy útil. Para otros, utilizando gcc para compilar y enlazar su programa (en lugar de utilizar ld directamente), usted puede agregar -Xlinker --verbose a gcc argumentos de línea de comandos para tener que pasar esta opción para ld.
    • Esto también me ayudó. El archivo Makefile que tenía era sólo esperando bibliotecas estáticas de lo acostumbrado -Wl,-Bstatic. Esto limita la búsqueda .solo archivos. La opción verbose mostró claramente. Una vez me quitaron -Wl,-Bstatic bibliotecas compartidas también se realizaron búsquedas.
    • Estoy en FreeBSD 10. El nuevo LLVM Clang cc toma un argumento de la forma -Wl,--verbose y pasa --verbose para el enlazador.
    • Que fue extremadamente útil. Me puede decir cómo se puede cambiar la ruta de acceso para un determinado indicador en ld?
    • Ahora que es lo que yo llamo una respuesta perfecta! Muchas gracias. Salvó un montón de tiempo. Sólo para agregar a ayudar a alguien como yo. Puede ser utilizado para depurar ruta de cuestiones relacionadas con el bien. Asegúrese de que usted compruebe la ruta de acceso con -L<ruta de acceso de directorio> con el comando ld -L<camino> -l<nombre de la biblioteca> –verbose
    • Cómo configurar make por lo que será detallado?
    • Gran respuesta. Esto me llevó a el problema para mí: el empaquetado libs había equivocado de permisos después de la colocación de ellos en el directorio /usr/local/lib. Me acaba de escribir: chmod 755 <lib_file_name> y mi fuente compilado.
    • Ver este respuesta. Esencialmente, para gcc, sólo tiene que añadir -Wl,--verbose a paso detallado para que el enlazador.
    • La punta sobre el uso de ld LIBNAME --verbose fue muy útil. En mi caso, ld se espera de el .pero yo tenía solamente .así.1.
    • Este consejo ld lzlib --verbose es tan útil. Me imaginé que fuera un misterio problema a partir de los afectados por esta salida del comando. En realidad, algunos lib*.así que es en realidad un enlace de secuencia de comandos e instruir a cómo vincular una biblioteca compartida para su uso.
    • Yo también tengo la misma salida para #ld -lzlib –verbose –> el intento de abrir /usr/x86_64-linux-gnu/lib64/libzlib.así fracasó el intento de abrir /usr/x86_64-linux-gnu/lib64/libzlib.un intento fallido de abrir //usr/local/lib/x86_64-linux-gnu/libzlib.así fracasó el intento de abrir //usr/local/lib/x86_64-linux-gnu/libzlib.un error
    • pero «sudo ln -s /usr/lib/libz.así.1.2.8 /usr/lib/libzlib.así que» esto no es trabajo para mí
    • Nunca he entendido cómo la biblioteca de encontrar trabajado por un largo tiempo. Esto finalmente ha respondido. Gracias.
    • trabajó para Cgwin.
    • Uno más, además de una gran respuesta. Yo también enfrenta con el mismo problema («el intento de abrir libc.un error»), pero en mi caso, dado que el final de la cadena de parámetro que se pasa a ld.exe parecía ser más de 8300 caracteres (número aproximado). Después de hacer toolchain camino más corto es el problema desapareció.
    • Ubuntu 16.10: sudo ln -s /usr/local/lib/libz.así.1.2.10 /usr/lib/libzlib.así
    • Gracias por la respuesta. Pero, ¿hay alguna manera de resolverlo, si no tengo permiso para crear el enlace simbólico?
    • Perfecto! Yo era perezoso y pasé la prueba de Cygwin en lugar de la de Ubuntu VM. Resulta que me tiro en el pie. Como un Windows calzador que crea a.exe en lugar de una.fuera, Cygwin también espera libxyz.dll, NO libxyz.así! Esto hizo claro para mí. Gracias!
    • Este debe ser aceptado por la respuesta!
    • No he encontrado esta en /usr/lib/libz.así.1.2.8
    • Véase la respuesta de abajo stackoverflow.com/a/42339395/332359 para una mejor manera de hacer el enlace simbólico a ti mismo.

  3. 33

    No parece ser cualquier respuesta en la que se aborda la muy principiante común problema de fallo en la instalación de la biblioteca requiere en primer lugar.

    Sobre Debianish plataformas, si libfoo falta, con frecuencia se puede instalar con algo parecido

    apt-get install libfoo-dev

    La -dev versión del paquete es necesario para el desarrollo del trabajo, incluso trivial trabajo de desarrollo tales como la compilación de código fuente para vincular a la biblioteca.

    El nombre del paquete a veces requerirá de algún tipo de decoración (libfoo0-dev? foo-dev sin la lib prefijo? etc), o simplemente puede usar su distribución búsqueda de paquetes para averiguar exactamente lo que los paquetes de un determinado archivo.

    (Si hay más de uno, usted tendrá que averiguar cuáles son sus diferencias. Escoger el mejor o el más popular es el común de acceso directo, pero no un procedimiento aceptable para cualquier desarrollo serio de trabajo.)

    Para otras arquitecturas (más notablemente RPM) procedimientos similares se aplican, a pesar de que los detalles serán diferentes.

    • Esto sólo me ayudó con un problema que tuve con un servidor nuevo y Perl. apt-get install libperl-dev ordenados por mí. Gracias 🙂
    • Este! No hay necesidad de meterse con el Makefile
    • Esta es probablemente la solución más común y me ayudó a compilar los cactus de la columna vertebral en CentOS 7. Un simple yum install openssl-devel resuelto.
    • Esta es la mejor solución si usted encuentra el enlace que termina en .así que es falta, pero tienes un enlace simbólico como libfoo.así.6 –> libfoo.así.6.0.2 (por ejemplo), en lugar de hacer el enlace simbólico a mano. (lo que significa que tiene el paquete de libfoo instalado, pero no libfoo-dev)
    • solucionado mis problemas al compilar openboard
  4. 30

    Durante la compilación con g++ a través de make definir LIBRARY_PATH si que puede no ser adecuado para cambiar el archivo Makefile con el -Lopción. Yo había puesto mi biblioteca adicional en /opt/lib así lo hice:

    $ export LIBRARY_PATH=/opt/lib/

    y luego corrió make para el éxito de la compilación y vinculación.

    Para ejecutar el programa con una biblioteca compartida definir:

    $ export LD_LIBRARY_PATH=/opt/lib/

    antes de ejecutar el programa.

  5. 30

    Tiempo De Compilación

    Cuando g++ dice cannot find -l<nameOfTheLibrary>, significa que g++ mirado el archivo lib{nameOfTheLibrary}.so, pero no podía encontrar en la biblioteca compartida de la ruta de búsqueda, que, por defecto, los puntos a /usr/lib y /usr/local/lib y en otro lugar tal vez.

    Para resolver este problema, debe proporcionar el archivo de biblioteca (lib{nameOfTheLibrary}.so) en las rutas de búsqueda o utilizar -L opción de comando. -L{path} dice el g++ (en realidad ld) para encontrar los archivos de la biblioteca en la ruta {path} además de las rutas de acceso predeterminadas.

    Ejemplo: Asumiendo que usted tiene una biblioteca en /home/taylor/libswift.so, y a la que desea vincular su aplicación a esta biblioteca. En este caso, usted debe suministrar el g++ con las siguientes opciones:

    g++ main.cpp -o main -L/home/taylor -lswift
    • Nota 1: -l opción recibe el nombre de biblioteca sin lib y .so en su principio y fin.

    • Nota 2: En algunos casos, el nombre de archivo de biblioteca es seguido por la versión, por ejemplo libswift.so.1.2. En estos casos, el g++ también no puede encontrar el archivo de biblioteca. Una solución sencilla para solucionar este problema es crear un enlace simbólico a libswift.so.1.2 llamado libswift.so.


    Tiempo de ejecución

    Al vincular su aplicación a una biblioteca compartida, es necesario que la biblioteca permanecerá disponible cada vez que se ejecuta la aplicación. En tiempo de ejecución de la aplicación (en realidad enlazador dinámico) busca en 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 encontrar libswift.so en LD_LIBRARY_PATH (que apunta a las rutas de búsqueda por defecto). Para solucionar el problema se debe agregar que la variable con la ruta de acceso libswift.so es en.

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/taylor
  6. 9

    Primer lugar, usted necesita saber la regla de denominación de lxxx:

    /usr/bin/ld: cannot find -lc
    /usr/bin/ld: cannot find -lltdl
    /usr/bin/ld: cannot find -lXtst

    lc significa libc.so, lltdl significa libltdl.so, lXtst significa libXts.so.

    Así, es lib + lib-name + .so


    Una vez que sabemos el nombre, podemos utilizar locate a encontrar el camino de este lxxx.so archivo.

    $ locate libiconv.so
    /home/user/anaconda3/lib/libiconv.so   # <-- right here
    /home/user/anaconda3/lib/libiconv.so.2
    /home/user/anaconda3/lib/libiconv.so.2.5.1
    /home/user/anaconda3/lib/preloadable_libiconv.so
    /home/user/anaconda3/pkgs/libiconv-1.14-0/lib/libiconv.so
    /home/user/anaconda3/pkgs/libiconv-1.14-0/lib/libiconv.so.2
    /home/user/anaconda3/pkgs/libiconv-1.14-0/lib/libiconv.so.2.5.1
    /home/user/anaconda3/pkgs/libiconv-1.14-0/lib/preloadable_libiconv.so

    Si usted no puede encontrar que usted necesita para instalar por yum (yo uso CentOS). Por lo general, usted tiene este archivo, pero no vincula al lugar correcto.


    Link en el lugar correcto, por lo general 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

    • locate sólo funciona si está instalado y funcionando regularmente. Un crudo solución es ejecutar find en todo el disco, pero, por supuesto, va a tomar tiempo. Si usted se encuentra haciendo que, con frecuencia, considere la posibilidad de instalar locate sólo para bajar el (interactivos, humanos) costo de esta operación.
  7. 5

    Cuando se compila el programa debe proporcionar la ruta de acceso a la biblioteca; en g++ utiliza la opción-L:

    g++ myprogram.cc -o myprogram -lmylib -L/path/foo/bar
    • gracias, yo ya lo hacen, pero no funciona
    • De la propiedad que tenemos que cambiar en ccmake para que el Makefile se crea con el encadenado de la bandera? Quiero vincular mi -lARToolkitPlus bandera a un camino.
  8. 2

    Este error también puede ser provocada si el enlace simbólico es una biblioteca dinámica, .así, pero por motivos de compatibilidad -static aparece entre el enlace de banderas. Si es así, trate de quitarla.

  9. 2

    Compruebe la ubicación de la biblioteca, por ejemplo lxxx.así:

    locate lxxx.so

    Si no es en la /usr/lib carpeta, tipo este:

    sudo cp yourpath/lxxx.so /usr/lib

    Hecho.

    • Usted necesita tener cuidado en la copia de las bibliotecas de los directorios del sistema.
  10. 2

    Aparte de las respuestas ya dadas, también puede darse el caso de que el *.así que el archivo existe pero no es nombrado correctamente. O puede darse el caso de que *.así que el archivo existe pero que es propiedad de otro usuario /root.

    Tema 1: Impropio nombre de

    Si se vincula el archivo como -l<nameOfLibrary>
    a continuación, biblioteca de nombre de archivo DEBE ser de la forma lib<nameOfLibrary>
    Si sólo tiene <nameOfLibrary>.so archivo, cambie el nombre!

    Tema 2: Mal dueño

    Para comprobar que este no es el problema – ¿

    ls -l /path/to/.so/file

    Si el archivo es propiedad de root u otro usuario, usted necesita para hacer

    sudo chown yourUserName:yourUserName /path/to/.so/file
  11. 1

    La biblioteca que yo estaba tratando de enlace para que resultó tener un estándar de nombre (es decir, no era con el prefijo ‘lib’), por lo que se recomienda el uso de un comando como este para compilarlo –

    gcc test.c -Iinclude lib/cspice.a -lm

    • Sólo con el prefijo de «lib», para obtener un nombre estándar fijo para mí
  12. 0

    Aquí es Ubuntu información de mi ordenador portátil.

    lsb_release -a
    No LSB modules are available.
    Distributor ID: Ubuntu
    Description:    Ubuntu 18.04.2 LTS
    Release:    18.04
    Codename:   bionic

    Yo uso localizar a encontrar el .por lo que los archivos de boost_filesystem y boost_system

    locate libboost_filesystem
    locate libboost_system

    A continuación, vincular .por lo que los archivos de /usr/lib y cambiar el nombre a .así

    sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.65.1 /usr/lib/libboost_filesystem.so
    sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 /usr/lib/libboost_system.so

    Hecho! Paquete de R velocyto.R se ha instalado correctamente!

Dejar respuesta

Please enter your comment!
Please enter your name here