web-dev-qa-db-fra.com

Erreur Linux c ++: référence non définie à 'dlopen'

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);
}
128
user101375

Vous devez créer un lien contre libdl, ajouter

-ldl

à vos options d'éditeur de liens

230
Masci

@ 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 ...

60
knocte

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.

7
bawey

vous pouvez essayer d'ajouter ceci

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

aux options de configuration

4
user2948547

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.

3
Rob

ç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).

3
vulcan raven

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 ()

2
Lucas Coelho

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 ' .

1
Deqing

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.

1
Amitk
 $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.
1
flerb