linux动态链接库使用方法分享

2019-09-23 09:43:03刘景俊

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