Devi collegarti a libdl, aggiungi
-ldl
alle opzioni del linker
Stavo usando CMake per compilare il mio progetto e ho riscontrato lo stesso problema.
La soluzione qui descritta funziona a meraviglia, aggiungi semplicemente ${CMAKE_DL_LIBS} alla chiamata target_link_libraries()
@Masci è corretto, ma nel caso tu stia usando C (e il gcc
compiler) tieni presente che questo non funziona:
gcc -ldl dlopentest.c
Ma questo fa:
gcc dlopentest.c -ldl
Mi ci è voluto un po' per capire...
questo non funziona:
gcc -ldl dlopentest.c
Ma questo fa:
gcc dlopentest.c -ldl
Questa è sicuramente una "caratteristica" fastidiosa
Stavo lottando con esso durante la scrittura della sintassi heredoc e ho trovato alcuni fatti interessanti . Con CC=Clang
, funziona:
$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
così come tutti questi:
$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
Tuttavia, con CC=gcc
, funziona solo l'ultima variante; -ldl
dopo -
(il simbolo dell'argomento stdin).