动态链接库的使用

动态链接库(.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);





原文地址:https://www.cnblogs.com/whuqin/p/4982003.html