Ошибка Linux c ++: неопределенная ссылка на «dlopen» - PullRequest
123 голосов
/ 05 июня 2009

Я работаю в Linux с C ++ (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);
}

Ответы [ 10 ]

223 голосов
/ 05 июня 2009

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

-ldl

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

59 голосов
/ 10 апреля 2014

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

gcc -ldl dlopentest.c

Но это так:

gcc dlopentest.c -ldl

Мне понадобилось немного, чтобы понять ...

7 голосов
/ 06 июля 2014

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

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

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

3 голосов
/ 24 июня 2018

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

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 после - (символ аргумента стандартного ввода).

3 голосов
/ 21 августа 2014

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

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

для настройки параметров

3 голосов
/ 17 августа 2010

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

LDFLAGS='-ldl'
make install

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

2 голосов
/ 28 марта 2019

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

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

1 голос
/ 07 июня 2017
 $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.
1 голос
/ 30 апреля 2016

Чтобы использовать функции dl, необходимо использовать флаг -ldl для компоновщика.

как ты делаешь это в затмении?

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

1 голос
/ 27 июня 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...