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

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

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

Вот мой код для 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

    установка Scilab в OpenSUSE 11.3

    Netbeans не отображает на моем компьютере

    Не удалось выполнить paswordless ssh даже после выполнения стандартной процедуры

    Как минимизировать ненужные файлы, установленные зависимостями пакетов?

    Как запустить TOR при загрузке вместо Vidalia?

    Использование –exclude с командой du

    Как отключить предупреждающее сообщение для репозиториев Apt с использованием SHA1?

    В POSIX sed период (точка) соответствует новой строке в многострочном пространстве шаблонов?

    Почему моя файловая система ext4 распознается только на машине, на которой она была отформатирована?

    Измените размер раздела ext4, чтобы создать больше inodes?

    Сколько дискового пространства должно быть выделено для FreeBSD?

    Генерировать JSON из данных, разделенных двоеточиями, в сценарии оболочки

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

    Как прекратить зарядку аккумулятора до 100% в OpenBSD?

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

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