动态链接库的使用

来源:互联网 发布:yii2.0源码分析 编辑:程序博客网 时间:2024/05/17 22:07

动态链接库(.so)可以让程序在运行时被加载,当so修改时,使用程序不需要重新编译就可以使用。本文介绍几个函数,讲述so的加载和方法调用。

void * dlopen( const char * pathname, int mode);
以指定模式打开某动态链接库文件,返回句柄。

模式有:RTLD_LAZY, RTLD_NOW; RTLD_GLOBAL, RTLD_LOACAL;RTLD_NODELETE, RTLD_NOLOAD,RTLD_DEEPBIND


void* dlsym(void* handle, const char* symbol)
handle是由dlopen打开动态库返回的指针,symbol是要获取的函数或全局变量的名称,返回值是指向函数的地址,供后续调用。


int dlclose(void* handle)
关闭动态库,handle是dlopen返回的句柄。只有当次动态库的使用计数为0时,才会真正被系统卸载。


实例:

被调用的代码

A* GetA(){    return new A;}class A {    public:        void say()        {               cout << "hello" << endl;        }   }

编译成A.so,主程序调用

//函数指针A* (*pGetA)();void* handle = dlopen("A.so", RTLD_LAZY);pGetA = (A* (*)())dlsym(handle, "GetA");A* a = (*pGetA)();a->say();dlclose(handle);