void *dlopen(const char *filename, int flag);
char *dlerror(void);
void *dlsym(void *handle, const char *symbol);
int dlclose(void *handle);
Link with -ldl.
dlopen()是一个强大的库函数。该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。写个测试程序调用上面生产libcac.so库如下所示:
#include <stdio.h>
#include <dlfcn.h>
#define DLL_FILE_NAME "libcac.so"
int main()
{
void *handle;
int (*func)(int, int);
char *error;
int a = 30;
int b = 5;
handle = dlopen(DLL_FILE_NAME, RTLD_NOW);
if (handle == NULL)
{
fprintf(stderr, "Failed to open libaray %s error:%sn", DLL_FILE_NAME, dlerror());
return -1;
}
func = dlsym(handle, "add");
printf("%d + %d = %dn", a, b, func(a, b));
func = dlsym(handle, "sub");
printf("%d + %d = %dn", a, b, func(a, b));
func = dlsym(handle, "div");
printf("%d + %d = %dn", a, b, func(a, b));
func = dlsym(handle, "mul");
printf("%d + %d = %dn", a, b, func(a, b));
dlclose(handle);
return 0;
}
程序执行结果如下所示:gcc call_main.c -o call_main -ldl










