我正在编写一段从动态库加载函数(接收 2 个字符指针和一个 int 并返回一个 int)的代码,这给我带来了麻烦。我无法访问库代码。我的代码如下所示:
typedef int (*func_t)(char*, char*, int);
func_t funcptr;
void *lib = dlopen(library.so, RTLD_LAZY);
if(dlerror() != NULL)
fprintf(stderr, "Error at dlopen");
funcptr = (func_t) dlsym(lib, "function");
if(dlerror() != NULL)
fprintf(stderr, "Error at dlsym");
(*funcptr)(arg1, arg2, arg3);//arguments are correct, no problem there
dlclose(lib);
当我运行它时,它总是抛出错误消息并且该函数不执行。我几乎尝试了一切。有人可以帮忙吗?
编辑:我已经打印了 dlerror() 返回的字符串:首先它说“没有这样的文件或目录”,然后是“ undefined symbol :函数”。我以为我可能在错误的目录中搜索,所以我使用 getcwd 检查了它,并且我正在正确的目录中搜索。
最佳答案
仔细阅读 dlopen(3) ..
请注意,当给定不带 /
的文件名时,dlopen
会出现奇怪但已记录的行为;因此请仔细阅读该手册页多次!
library.so
看起来非常可疑......您真的有一个带有名为 so
字段的 library
变量吗?也许您需要一个文字字符串 "library.so"
。然后尝试
typedef int (func_sig_t)(char*, char*, int);
func_sig_t* funcptr;
void *lib = dlopen("./library.so", RTLD_LAZY);
if (!lib)
{ fprintf(stderr, "dlopen failed: %s\n", dlerror());
exit(EXIT_FAILURE); };
funcptr = (func_sig_t*) dlsym(lib, "function");
if (!funcptr)
{ fprintf(stderr, "dlsym failed: %s\n", dlerror());
exit(EXIT_FAILURE); };
int res = funcptr(arg1, arg2, arg3);
dlclose (lib);
funcptr = NULL;
使用gcc -Wall -g
编译。并且使用gdb
调试器!
关于c - C 中的动态加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23298543/