Yo trabajo en Linux con C++ (Eclipse), y desea utilizar una biblioteca.
Eclipse me muestra un error:

undefined reference to 'dlopen' 

¿Sabe una solución?

Aquí está mi código:

#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>

int main(int argc, char **argv) {
    void *handle;
    double (*desk)(char*);
    char *error;

    handle = dlopen ("/lib/CEDD_LIB.so.6", RTLD_LAZY);
    if (!handle) {
        fputs (dlerror(), stderr);
        exit(1);
    }

    desk= dlsym(handle, "Apply");

    if ((error = dlerror()) != NULL)  {
        fputs(error, stderr);
        exit(1);
    }

    dlclose(handle);
}
InformationsquelleAutor user101375 | 2009-06-05

10 Comentarios

  1. 227

    Tiene que vincular contra libdl, agregar

    -ldl

    a sus opciones del vinculador

    • Se han topado con el mismo problema… he añadido el compilador de la bandera en el marco del Proyecto>Propiedades>C/C++Build>Configuraciones>(Mi Linker)>varios en el Enlazador campo de texto. No hizo nada.
    • Ha, ok, para cualquier persona que tiene este problema, utilice la ruta de arriba, a excepción de ir a las Bibliotecas en lugar de varios y agregar el ‘dl’
    • Esta respuesta ayudado. Para cualquier persona que quiera encontrar la ubicación de libdl.así, sólo tiene que ir a la raíz del directorio y el tipo locate libdl.so
    • MirroredFate la respuesta trabajó para mí también. No entiendo por qué, a pesar de que; todos los demás de la biblioteca que he tenido que hacer de enlace trabajado cuando se coloca en Varios.
  2. 59

    @Masci es correcta, pero en caso de que usted está usando C (y la gcc compilador) tomar en cuenta que esto no funciona:

    gcc -ldl dlopentest.c

    Pero esto sí:

    gcc dlopentest.c -ldl

    Me tomó un poco de averiguar…

    • Eso es un molesto «característica» de seguro …
    • He encontrado que el orden de las opciones importa demasiado. En un proyecto usando sqlite3, me tengo que poner -ldl (y -lpthread) después de lsqlite3. No sé lo que es, estoy seguro de que la respuesta es no, si yo sólo sería RTFM.
    • Mierda santa, que es! Yo nunca hubiera imaginado que poner las opciones de primera (lo que hace más sentido para mí) no funciona, mientras que ponerlos después de que hace. Gracias, @knocte!
    • golpear el clavo en la cabeza. Tuve que poner la opción-l en el orden «correcto».
  3. 7

    El tema es bastante antiguo, pero he luchado con el mismo problema de hoy, mientras que la compilación de cegui 0.7.1 (openVibe requisito previo).

    Lo que funcionó para mí era establecer: LDFLAGS="-Wl,--no-as-needed"
    en el Makefile.

    También he intentado -ldl para LDFLAGS pero fue en vano.

  4. 4

    usted puede tratar de añadir este

    LIBS=-ldl CFLAGS=-fno-strict-aliasing

    para configurar las opciones de

    • El uso de las BIBLIOTECAS de la variable trabajado para mí, para llegar a configurar poner-ldl en el lugar correcto en la línea de comandos.
  5. 3

    Usted necesita para hacer algo como esto en el fichero makefile:

    LDFLAGS='-ldl'
    make install

    Que va a pasar, el enlazador de hacer a través del enlazador. No importa que el archivo makefile se ha generado automáticamente.

  6. 3

    esto no funciona:

    gcc -ldl dlopentest.c

    Pero esto sí:

    gcc dlopentest.c -ldl

    Que un molesto «característica» de seguro

    Yo estaba luchando con él al escribir la sintaxis heredoc y encontré algunos hechos interesantes. Con CC=Clang, esto funciona:

    $CC -ldl -x c -o app.exe - << EOF
    #include <dlfcn.h>
    #include <stdio.h>
    int main(void)
    {
      if(dlopen("libc.so.6", RTLD_LAZY | RTLD_GLOBAL))
        printf("libc.so.6 loading succeeded\n");
      else
        printf("libc.so.6 loading failed\n");
      return 0;
    }
    EOF
    
    ./app.exe

    así como a todos estos:

    • $CC -ldl -x c -o app.exe - << EOF
    • $CC -x c -ldl -o app.exe - << EOF
    • $CC -x c -o app.exe -ldl - << EOF
    • $CC -x c -o app.exe - -ldl << EOF

    Sin embargo, con CC=gcc, sólo la última variante de obras; -ldl después de - (stdin argumento símbolo).

  7. 2

    Yo estaba usando CMake para compilar mi proyecto y me he encontrado con el mismo problema.

    La solución descrita aquí funciona como un encanto, simplemente agregue ${CMAKE_DL_LIBS} a la target_link_libraries() la llamada

  8. 1

    Con el fin de utilizar dl funciones que usted necesita para utilizar el ldl-bandera para el enlazador.

    cómo hacerlo en eclipse ?

    De prensa Proyecto –> Propiedades –> C/C++ build –> Configuración –> GCC C++ Linker –>
    Bibliotecas –>
    en las «Bibliotecas(-l)» cuadro de pulse el signo » + » –> escribir «dl» (sin las comillas)-> pulse aceptar –> clean & reconstruir su proyecto.

  9. 1
     $gcc -o program program.c -l <library_to_resolve_program.c's_unresolved_symbols>

    Una buena descripción de por qué la colocación de l dl asuntos

    Pero también hay una muy sucinta explicación en el docs
    Desde $man gcc

       -llibrary
       -l library
           Search the library named library when linking.  (The second
           alternative with the library as a separate argument is only for POSIX
           compliance and is not recommended.)
           It makes a difference where in the command you write this option; the
           linker searches and processes libraries and object files in the order
           they are specified.  Thus, foo.o -lz bar.o searches library z after
           file foo.o but before bar.o.  If bar.o refers to functions in z,
           those functions may not be loaded.

Dejar respuesta

Please enter your comment!
Please enter your name here