Tienes que vincular contra libdl, agregar
-ldl
a sus opciones de enlace
Estaba usando CMake para compilar mi proyecto y encontré el mismo problema.
La solución descrita aquí funciona de maravilla, simplemente agregue ${CMAKE_DL_LIBS} a la llamada target_link_libraries()
@Masci es correcto, pero en caso de que esté usando C (y el gcc
compilador) tenga en cuenta que esto no funciona:
gcc -ldl dlopentest.c
Pero esto sí:
gcc dlopentest.c -ldl
Me tomó un poco averiguarlo...
esto no funciona:
gcc -ldl dlopentest.c
Pero esto sí:
gcc dlopentest.c -ldl
Seguro que esa es una "característica" molesta
Tuve problemas al escribir la sintaxis de heredoc y encontré algunos datos 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 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
, solo funciona la última variante; -ldl
después de -
(el símbolo del argumento stdin).