动态库(.so)函数调用

最近刚刚换工作,第一次接触到要从.so动态库文件里调用函数。目前只得到.so库文件和封装的各类函数接口。在网上搜了一些,然后根据自己的代码做了整理。

首先,理解动态库,Linux中的.so文件类似于Windows中的DLL,是动态链接库。当多个程序使用同一个动态链接库时,既能节约可执行文件的大小,也能减少运行时的内存占用。具体的如何编译生成.so可以参照linux下gcc命令。

具体在调用过程中主要用到dlopen()函数和dlsym()函数,一个为打开.so库,一个为找到需调用的函数。

1.根据dlopen()写了一个打开函数。

ST_VOID  * open_soXXX()
{
    ST_VOID *p = NULL;
    ST_CHAR *error = NULL;
p = dlopen("/lib/lib
XXXX.so",RTLD_LAZY);
    error = dlerror();
    if(error)
    {
        p = dlopen("lib/lib
XXXX.so",RTLD_LAZY);
        error = dlerror();
        if(error)
        {
        printf("error:%s", error);
        }
    }
       
 return p;
}

ST_VOID、ST_CHAR就是void和char类型,因为工程需要,所以进行修改。

2.根据dlsym()写了一个相应的调用过程

ST_INT (*get_num)(); //需要调用的get_num()原型为int get_num();。另外这里get_num命名可随意,这里必须要定义成指针,因为获取的是要调用函数的地址。

get_num=(int(*)())dlsym(handle,"get_num"); // 这里参数handle是dlopen()返回的指针,参数get_num是封装在库里的函数名,也就是你要调用的函数名。

int i=get_num(); //这里就可以直接调用该函数了。

你可能感兴趣的:(linux编程汇总)