Linux基础——(2)动态加载函数库

   结合(1)中讲到的动态库的打包制作和编译链接,这里讲一下动态加载函数的使用。demo部分代码如下:

// demo.c
#include 
#include 

int main(void)
{
        // 加载动态库文件
        void *handle = dlopen("libmath.so",RTLD_NOW);
        if(!handle){
                printf("%s\n",dlerror());
                return -1;
        }

        // 在动态库中寻找symbol的地址
        void *psub = dlsym(handle,"sub");
        if(!psub){
                printf("%s\n",dlerror());
                return -1;
        }
        void *padd = dlsym(handle,"add");
        if(!padd){
                printf("%s\n",dlerror());
                return -1;
        }
        void *pmax = dlsym(handle,"max");
        if(!pmax){
                printf("%s\n",dlerror());
                return -1;
        }
        
        typedef int (*func)(int,int) ;

        // 调用sub()函数,求两数之差
        func fsub = psub;
        printf("5 - 2 = %d\n",fsub(5,2));
        // 调用add()函数,求两数之和
        func fadd = padd;
        printf("5 + 2 = %d\n",fadd(5,2));
        // 调用max()函数,求两数中值较大的数
        func fmax = pmax;
        printf("5 和2 比较大的是:%d\n",fmax(5,2));

        //关闭动态库
        dlclose(handle);
        return 0;
}

编译运行结果如下:

kissness:libs$ gcc -o dl dl.c -ldl
kissness:libs$ ./dl
5 - 2 = 3
5 + 2 = 7
5 和2 比较大的是:5

从上面代码我们重点回顾几个比较重要的函数:

1、dlopen(3)
#include

void *dlopen(const char *filename, int flag);
功能:加载动态库
参数:
filename:指定了要加载的动态库文件的名字
flag:    RTLD_LAZY:懒加载,懒绑定 只有执行到这个函数的时候才绑定
           RTLD_NOW:立即加载
返回值:
失败 返回NULL
正确 返回一个地址 handle


2、char *dlerror(void);
功能:返回最近调用dlopen/、dlclose、dlsym产生的错误信息参数
参数:void
返回值:
NULL    没有错误产生
非空就返回一个描述错误的字符串


3、void *dlsym(void *handle, const char *symbol);
功能:获取symbol加载到内存里的地址
参数:
handle:dlopne(3)的返回值
symbol:指定了函数的名字
返回值:
NULL 说明symbol没有找到
返回symbol的装载到内存里的地址


4、int dlclose(void *handle)
功能:让动态库的引用奇数减1
参数:
handle:指定了要关闭的动态库的handle。dlopen(3)的返回值
返回值:
0    正确
非0     错误

5、在编译的过程中记得要添加 -ldl 选项
gcc -o dl dl.c -ldl

===========================


    动态加载函数库的方法相比较前面讲到的在编译时链接动态和静态库的用法,我们发现这里有一个什么好处呢,就是我们在编码的过程中只需要.so和库文件和知道库文件中可调用的API名称就可以了,不再需要头文件。在某些应用场景这种“优点”将会发挥作用。

你可能感兴趣的:(C++编程)