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