【发布时间】:2014-06-11 11:42:57
【问题描述】:
我正在编写一段代码,该代码从动态库加载一个函数(接收 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 检查了它,并在正确的目录中搜索。
【问题讨论】:
-
library.so的值是多少?并且你假设输出dlerror()返回的字符串,而不只是检查它是否是NULL。 -
打印 dlerror() 返回的字符串。它会告诉你出了什么问题。
-
另外,请仔细阅读 dlopen(3).. 你的代码可以编译吗?
library.so看起来很奇怪(也许你的意思是"./library.so"....)。使用gcc -Wall -g编译,然后使用调试器 (gdb) -
事实上,这只是我为完成大学工作而必须完成的更大计划的一部分。 library.so 是我的老师写的,他们给了我一个 Makefile 来编译。无论如何,我会尝试使用 ./library.so
-
它可能应该是一个文字字符串,其中包含一些共享 ELF 可执行文件的文件路径。所以引号
"是绝对必要的!目前尚不清楚您的代码是否正在编译!