Je travaille sous Linux avec C++ (Eclipse) et souhaite utiliser une bibliothèque. Eclipse me montre une erreur:
undefined reference to 'dlopen'
Connaissez-vous une solution?
Voici mon code:
#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);
}
Vous devez créer un lien contre libdl, ajouter
-ldl
à vos options d'éditeur de liens
@ Masci est correct, mais si vous utilisez C (et le compilateur gcc
,) tenez compte du fait que cela ne fonctionne pas:
gcc -ldl dlopentest.c
Mais cela fait:
gcc dlopentest.c -ldl
Il m'a fallu un peu pour comprendre ...
Le sujet est assez ancien, mais j’ai eu de la difficulté avec le même problème aujourd’hui lors de la compilation de cegui 0.7.1 (condition préalable à openVibe).
Ce qui a fonctionné pour moi a été de définir: LDFLAGS="-Wl,--no-as-needed"
dans le Makefile.
J'ai aussi essayé -ldl
pour LDFLAGS
mais en vain.
vous pouvez essayer d'ajouter ceci
LIBS=-ldl CFLAGS=-fno-strict-aliasing
aux options de configuration
Vous deviez faire quelque chose comme ceci pour le makefile:
LDFLAGS='-ldl'
make install
Cela transmettra les drapeaux de l'éditeur de liens à l'éditeur de liens. Peu importe que le makefile ait été généré automatiquement.
ça ne marche pas:
gcc -ldl dlopentest.c
Mais cela fait:
gcc dlopentest.c -ldl
C'est une "fonctionnalité" ennuyeuse à coup sûr
J'avais du mal à écrire la syntaxe Heredoc lorsque j'ai trouvé quelques faits intéressants. Avec CC=Clang
, cela marche:
$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
ainsi que tous ceux-ci:
$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
Cependant, avec CC=gcc
, seule la dernière variante fonctionne; -ldl
après -
(le symbole d'argument stdin).
J'utilisais CMake pour compiler mon projet et j'ai trouvé le même problème.
La solution décrite ici fonctionne comme un charme, ajoutez simplement $ {CMAKE_DL_LIBS} à l'appel target_link_libraries ()
J'ai rencontré le même problème même en utilisant -ldl
.
Outre cette option, les fichiers source doivent être placés avant les bibliothèques, voir référence non définie à `dlopen ' .
Pour utiliser les fonctions dl, vous devez utiliser l'indicateur -ldl pour l'éditeur de liens.
comment vous le faites dans Eclipse?
Appuyez sur Projet -> Propriétés -> version C/C++ -> Paramètres -> - GCC C++ Linker ->
Bibliothèques -> dans la zone "Bibliothèques (-l)" appuyez sur le signe "+" -> écriture "dl "(sans les guillemets) -> appuyez sur ok -> nettoyer & reconstruire votre projet.
$gcc -o program program.c -l <library_to_resolve_program.c's_unresolved_symbols>
ne bonne description de la raison pour laquelle le placement de -l dl est important
Mais il y a aussi une explication assez succincte dans la documentation De $ 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.