c++ - oxygen - eclipse portable
Error de Linux c++: referencia indefinida a ''dlopen'' (8)
Trabajo en Linux con C ++ (Eclipse) y quiero usar una biblioteca. Eclipse me muestra un error:
undefined reference to ''dlopen''
¿Conoces 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);
}
@Masci es correcto, pero en caso de que esté usando C (y el compilador gcc
) tenga en cuenta que esto no funciona:
gcc -ldl dlopentest.c
Pero esto hace:
gcc dlopentest.c -ldl
Me tomó un poco descubrirlo ...
El tema es bastante antiguo, pero 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 Makefile.
También intenté -ldl
para LDFLAGS
pero fue en vano.
Me encontré con el mismo problema incluso con -ldl
.
Además de esta opción, los archivos fuente deben colocarse antes que las bibliotecas, consulte la referencia no definida a `dlopen '' .
Necesitabas hacer algo como esto para el archivo MAKE:
LDFLAGS=''-ldl''
make install
Eso pasará las banderas del enlazador desde la marca hasta el enlazador. No importa que el archivo MAKE haya sido autogenerado.
Para usar las funciones dl, necesita usar el indicador -ldl para el enlazador.
¿Cómo lo haces en eclipse?
Presione Proyecto -> Propiedades -> C / C ++ build -> Configuración -> GCC C ++ Linker ->
Bibliotecas -> en el cuadro "Bibliotecas (-l)" presione el signo "+" -> escriba " dl " (sin las comillas) -> pulse aceptar -> limpiar y reconstruir su proyecto.
Tienes que enlazar con libdl, agregar
-ldl
a sus opciones de vinculador
puedes intentar agregar esto
LIBS=-ldl CFLAGS=-fno-strict-aliasing
a las opciones de configuración
$gcc -o program program.c -l <library_to_resolve_program.c''s_unresolved_symbols>
Una buena descripción de por qué importa la ubicación de -l dl
Pero también hay una explicación bastante sucinta en los documentos From $ 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.