我在一段代码中工作,它从动态库加载一个函数(接收2个char指针和一个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()返回的字符串:首先它说“没有这样的文件或目录”,然后是“未定义的符号:函数” . 我以为我可能在错误的目录中搜索,所以我使用getcwd检查它,我在正确的目录中搜索 .
1 回答
仔细阅读dlopen(3) ..
请注意,在给出没有/的文件名时,dlopen有一个奇怪但有记录的行为 . 所以仔细阅读该页面几次!
library.so
看起来非常可疑....你真的有一个名为so
的字段的library
变量吗?也许你想要一个文字字符串"library.so"
. 然后试试用
gcc -Wall -g
编译 . 而且 use the gdb debugger !