Неопределенная ссылка при компиляции драйвера с файлом совместно используемой библиотеки

Я сделал простой ящик памяти, и я пытаюсь скомпилировать его с помощью общей библиотеки в драйвере.

Файлы разделяемой библиотеки сами компилируются. Однако, когда я скомпилировал драйвер, вызывая функции в общей библиотеке с моим менеджером памяти, он показывает мне снимок экрана ниже: Сообщения об ошибках

Вот мой код для shared.c

/* conveniences for casting and declarations */ typedef block_info* (*MM_CREATE)(size_t, MMPolicy); typedef void* (*MM_ALLOCATE)(block_info *, size_t, char *); typedef int (*MM_DEALLOCATE)(block_info *, void *); typedef void (*MM_DESTROY)(block_info *); /* Function pointers retrieved from the shared library */ typedef struct LibraryFunctions { MM_CREATE create; MM_DESTROY destroy; MM_ALLOCATE allocate; MM_DEALLOCATE deallocate; }LibraryFunctions; /* Loads a shared library and returns a pointer to it in libhandle */ /* Returns SUCCESS, if it successful, otherwise, FAILURE */ int load_library(const char *libname, void **libhandle) { *libhandle = dlopen(*libhandle, RTLD_LAZY); if(!(*libhandle)) { return FAILURE; } else { return SUCCESS; } return *libname; } int get_functions(void *libhandle, LibraryFunctions *functions, const char **fn_names) { functions->create = (MM_CREATE)(intptr_t)dlsym(libhandle, *fn_names); if(!functions->create) { return FAILURE; } functions->destroy = (MM_DESTROY)(intptr_t)dlsym(libhandle, *fn_names); if(!functions->destroy) { return FAILURE; } functions->allocate = (MM_ALLOCATE)(intptr_t)dlsym(libhandle, *fn_names); if(!functions->allocate) { return FAILURE; } functions->deallocate = (MM_DEALLOCATE)(intptr_t)dlsym(libhandle, *fn_names); if(!functions->deallocate) { return FAILURE; } return SUCCESS; 

} Вот часть кода драйвера для вызова общей библиотеки:

 void setup(void) { const char *fn_names[] = {"mm_create", "mm_destroy", "mm_allocate", "mm_deallocate"}; LibraryFunctions funs; int error; error = load_library("./libmemmgr.so", &gLib); if (error == FAILURE) { printf("load_library failed! %s\n", dlerror()); exit(-1); } error = get_functions(gLib, &funs, fn_names); if (error == FAILURE) { printf("get_functions failed! %s\n", dlerror()); exit(-1); } mmlib_create = funs.create; mmlib_destroy = funs.destroy; mmlib_allocate = funs.allocate; mmlib_deallocate = funs.deallocate; 

}

 void teardown(void) { dlclose(gLib); } 

Я не уверен, что вызывает ошибки.

edit: Мне удалось запустить exe-файл, но я не смог выполнить «get_functions». Есть ли проблемы с моими функциями get_functions?

    One Solution collect form web for “Неопределенная ссылка при компиляции драйвера с файлом совместно используемой библиотеки”

    Вы, кажется, не связываетесь с библиотекой dl , где определены dlclose и dlerror (по крайней мере, в Linux).

    Вы также не привязываетесь к своей собственной общей библиотеке, где вы определили функцию load_library . Вы не показываете код, который определяет get_functions , поэтому я не уверен, где он живет.

    Итак: ваша общая библиотека должна быть названа libfoo.so , и вам нужно добавить -L. -lfoo -ldl -L. -lfoo -ldl в вашу командную строку компилятора, после всех файлов .c . -L. сообщит компилятору, чтобы добавить текущий каталог в путь поиска библиотеки, -lfoo сообщит ему, чтобы он libfoo.so на libfoo.so из текущего каталога, а -ldl будет сообщать ему также ссылку на libdl.so другом месте в пути поиска библиотеки (вероятно, / usr / lib).

    Interesting Posts

    man -k не возвращает результатов

    Не удается перейти в существующий каталог

    Выполнение нескольких команд sed в одних и тех же файлах одновременно

    Fedora 24 KDE – нет постоянных настроек громкости на приложение

    строка grep, где следующая строка не содержит строки

    Когда exFAT приходит в Linux?

    Преобразование файла с целыми числами, написанными в ascii, в двоичный файл целых чисел

    Как вы отображаете цвета xterm с помощью putty / bash?

    Awk Использование NR для вывода номера итерации

    Есть ли причина, по которой я получаю ^ [[A, когда я нажимаю стрелку на экране входа в консоль?

    Как я могу получить первый матч от расширения подстановочных знаков?

    Nginx wordpress и неправильный путь

    Отключить индикатор блокировки num lock или обратную клавиатуру, поэтому, когда включена функция num lock, индикатор выключен

    awk или sed, переместите первый столбец в конец?

    Использование вывода mpv ASCII с w3m

    Linux и Unix - лучшая ОС в мире.