0
喜林加载函数动态和执行它们。我希望能够定义一个通用的返回类型,以便编译器可以正确地清理堆栈。目前它的版本字符串的打印乱码。通用返回类型dl'ed功能
我怎样才能让下面的代码工作?
// gcc -o test test.c -ldl
#include <stdio.h>
#include <dlfcn.h>
typedef union { int i; double d; float f; char *p;} anytype;
int main()
{
anytype ver2;
anytype (*f)();
void *handle = dlopen("libz.so.1", RTLD_NOW|RTLD_GLOBAL);
f = dlsym(handle,"zlibVersion");
//const char * zlibVersion (void);
ver2=f();
printf("zlib version %s\n", ver2.p);
dlclose(handle);
return 0;
}
使用的是精确匹配被调用的函数的函数指针类型。在这种情况下,将'f'定义为'const char *(* f)(void)'。尽管你的代码应该按照原样工作,但没有理由按照你的方式去做。 – 2013-04-25 17:23:00
@ nm肯定有一个原因!这有点像Visual C Edit-and-Continue的工作原理。 – Mastertronic 2013-04-25 17:30:50
我敢肯定的Visual C编辑并继续无关用'dlopen'和'RTLD_GOLBAL'任何责任。即使Visual C++中的某些代码与您所写的内容相似,这对任何在该环境之外进行编程的人,也可能对于在其中工作的人而言绝对没有任何意义。 – 2013-04-25 17:37:08