我采用从共享库中载入函数的列子:
库中的两个函数项标准输出显示字符串,第一个函数为sayhell,显示他内部声明的串:
#include <stdio.h>
void sayhello()
{
printf("hello from a loaded function/n");
}
第二个函数saysomething 需要传入字符串作参数:
#include <stdio.h>
void saysomething(char *string)
{
printf("%s/n",string);
}
使用如下命令将这两个函数编译成为之独立的代码,并用他们创建共享库libsayfn.so:
gcc -fpic -shared sayhello.c saysomething.c -o libsayfn.so
可动态的加载这些函数的程序使用4个基本函数。调用dlopen()将共享库载入内存(如果他不在内存中),返回的句柄可用来定位,调用dlsym()返回函数的地址。调用dlclose()从共享库中释放当前的程序。如果没有其他程序与他相连,就会从内存中卸载该动态库。函数dlerror()返回描述性字符串,描述最近调用的这些函数产生的任何可能的错误。如果没有发生错误,函数dlerror()返回NUll。
下面的程序载入共享库libsayfn.so,并执行其中包含的两个函数:
#include <dlfcn.h>
#include <stdio.h>
int main(int argc,char *argv[])
{
void *handle;
char *error;
void (*sayhello)(void);
void (*saysomething)(void);
handle = dlopen("libsayfn.so",RTLD_LAZY);
if(error = dlerror())
{
printf("%s/n",error);
exit(1);
}
sayhello = dlsym(handle,"sayhello");
if(error = dlerror())
{
printf("%s/n",error);
exit(1);
}
sayhello = dlsym(handle,"saysomething");
if(error = dlerror())
{
printf("%s/n",error);
exit(1);
}
sayhello();
saysomething("This is something");
dlclose(handle);
}
函数main()顶端就声明了句柄,用来定位共享库,字符串字针包含所有错误信息的地址,可在库中找到每个函数的字针。
编译本例的命令行,需要包含库,词库含有调用函数,如下:
gcc say.c -ldl -o say ;
错误提示
say.c: In function `main':
say.c:34: error: too many arguments to function
修改