Ответ 1
Вам нужно установить ссылку на libdl, добавить
-ldl
к вашим настройкам компоновщика
Я работаю в 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);
}
Вам нужно установить ссылку на libdl, добавить
-ldl
к вашим настройкам компоновщика
@Masci верен, но если вы используете C (и gcc
компилятор), учтите, что это не работает:
gcc -ldl dlopentest.c
Но это делает:
gcc dlopentest.c -ldl
Я немного подумал...
Тема довольно старая, но я боролся с той же проблемой сегодня, компилируя cegui 0.7.1 (предварительное условие openVibe).
Что сработало для меня было установить: LDFLAGS="-Wl,--no-as-needed"
в Makefile.
Я также пробовал -ldl
для LDFLAGS
, но безрезультатно.
вы можете попробовать добавить это
LIBS=-ldl CFLAGS=-fno-strict-aliasing
для параметров конфигурации
это не работает:
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
).
Вам нужно было сделать что-то подобное для make файла:
LDFLAGS='-ldl'
make install
Это передаст флаги компоновщика от make до компоновщика. Не имеет значения, что make файл был сгенерирован автоматически.
Я встретил ту же проблему, даже используя -ldl
.
Помимо этой опции исходные файлы должны быть размещены перед библиотеками, см. undefined ссылку на` dlopen '.
Для использования функций dl вам нужно использовать флаг -ldl для компоновщика.
как вы это делаете в eclipse?
Нажмите Проект → Свойства → C/С++ build → Настройки → GCC С++ Linker →
Библиотеки → в поле "Библиотеки (-l)" нажмите знак "+" → напишите " dl" (без кавычек) → нажмите ok → очистить и перестроить ваш проект.
$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.
Я использовал CMake для компиляции своего проекта, и я обнаружил ту же проблему.
Описанное здесь решение работает как чудо, просто добавьте $ {CMAKE_DL_LIBS} к вызову target_link_libraries()