Ошибка Linux С++: undefined ссылка на 'dlopen'

Я работаю в Linux с С++ (Eclipse) и хочу использовать библиотеку. Eclipse показывает мне ошибку:

undefined reference to 'dlopen' 

Знаете ли вы решение?

Вот мой код:

#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);
}

Ответ 1

Вам нужно установить ссылку на libdl, добавить

-ldl

к вашим настройкам компоновщика

Ответ 2

@Masci верен, но если вы используете C (и gcc компилятор), учтите, что это не работает:

gcc -ldl dlopentest.c

Но это делает:

gcc dlopentest.c -ldl

Я немного подумал...

Ответ 3

Тема довольно старая, но я боролся с той же проблемой сегодня, компилируя cegui 0.7.1 (предварительное условие openVibe).

Что сработало для меня было установить: LDFLAGS="-Wl,--no-as-needed" в Makefile.

Я также пробовал -ldl для LDFLAGS, но безрезультатно.

Ответ 4

вы можете попробовать добавить это

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

для параметров конфигурации

Ответ 5

это не работает:

gcc -ldl dlopentest.c

Но это делает:

gcc dlopentest.c -ldl

Это одна раздражающая "особенность" наверняка

Я боролся с этим, когда писал синтаксис heredoc, и нашел несколько интересных фактов. С CC=Clang это работает:

$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

а также все это:

  • $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

Однако при CC=gcc только последний вариант; -ldl после - (символ аргумента стандартного -ldl).

Ответ 6

Вам нужно было сделать что-то подобное для make файла:

LDFLAGS='-ldl'
make install

Это передаст флаги компоновщика от make до компоновщика. Не имеет значения, что make файл был сгенерирован автоматически.

Ответ 7

Я встретил ту же проблему, даже используя -ldl.

Помимо этой опции исходные файлы должны быть размещены перед библиотеками, см. undefined ссылку на` dlopen '.

Ответ 8

Для использования функций dl вам нужно использовать флаг -ldl для компоновщика.

как вы это делаете в eclipse?

Нажмите Проект Свойства C/С++ build Настройки GCC С++ Linker
Библиотеки → в поле "Библиотеки (-l)" нажмите знак "+" → напишите " dl" (без кавычек) → нажмите ok очистить и перестроить ваш проект.

Ответ 9

 $gcc -o program program.c -l <library_to_resolve_program.c's_unresolved_symbols>

Хорошее описание того, почему размещение -l dl имеет значение

Но в документах также есть довольно сжатое объяснение Из $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.

Ответ 10

Я использовал CMake для компиляции своего проекта, и я обнаружил ту же проблему.

Описанное здесь решение работает как чудо, просто добавьте $ {CMAKE_DL_LIBS} к вызову target_link_libraries()