2009-06-05 16 views
91

Trabajo en Linux con C++ (Eclipse) y quiero usar una biblioteca. Eclipse me muestra un error:Error de Linux C++: referencia indefinida a 'dlopen'

undefined reference to 'dlopen' 

¿Conoce 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); 
} 

Respuesta

181

Hay que enlazar con libdl, añadir

-ldl

a sus opciones de enlazador

+2

se han topado con el mismo problema ... Agregué el indicador del compilador en Proyecto> Propiedades> Compilación de C/C++> Configuración> (Mi enlazador) > Varios en el campo de texto de banderas del enlazador. No hizo nada. – MirroredFate

+3

Ha, vale, para cualquier otra persona que tenga este problema, utilice la ruta anterior, excepto ir a Bibliotecas en lugar de Miscelánea y agregue el 'dl' – MirroredFate

+1

Esta respuesta ayudó. Para cualquiera que quiera encontrar la ubicación de libdl.so, solo vaya al directorio raíz y escriba 'locate libdl.so' – Nav

2

que tenía que hacer algo como esto para el makefile:

LDFLAGS = '- ldl' make install

Eso pasará las banderas del enlazador de make through al enlazador. No importa que el archivo MAKE haya sido autogenerado.

1

Me encontré con el mismo problema incluso con -ldl.

Además de esta opción, los archivos fuente deben colocarse antes de las bibliotecas, consulte undefined reference to `dlopen'.

40

@Masci es correcta, pero en caso de que esté usando C (y el gcc compilador) tener en cuenta que esto no funciona:

Pero esto hace:

gcc dlopentest.c -ldl 

Me tomó un poco darme cuenta ...

+4

Esa es una "característica" molesta, sin dudas ... – User1291

+1

Descubrí que el orden de las opciones también es importante. En un proyecto que usa sqlite3, tengo que poner -ldl (y -lpthread) después de -lsqlite3. No sé qué es eso, estoy seguro de que la respuesta está ahí si solo quisiera RTFM. –

+0

¡Mierda, eso es todo! Nunca hubiera adivinado que poner las opciones primero (lo que tiene más sentido para mí) no funciona, mientras que ponerlas después lo hace. Gracias, @knocte! –

5

El tema es bastante antiguo, sin embargo, luché con el mismo problema hoy al compilar cegui 0.7.1 (requisito previo de openVibe).

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

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

2

se puede tratar de añadir este

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

a las opciones de configuración

+0

El uso de la variable LIBS funcionó para que configure configure para poner -ldl en el lugar correcto en la línea de comando. – duncan

1

Para utilizar las funciones dl que necesita para usar la bandera -ldl para el enlazador.

¿cómo lo haces en eclipse?

Press Project -->Properties -->C/C++ build -->Settings -->GCC C++ Linker -->
Libraries --> in the "Libraries(-l)" box press the "+" sign --> write "dl" (without the quotes)-> press ok -->clean & rebuild your project.

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

A good description of why the placement of -l dl matters

Pero también hay una explicación muy sucinta en la documentación 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. 
Cuestiones relacionadas