念加载动态链接库首先为共享库分配物理内存然后在进程对应的页表项中建立虚拟页和物理页面之间的映射。你可以认为系统中存在一种引用计数机制 每当一个进程加载了共享库在该进程的页表中进行一次映射引用计数加一一个进程显式卸载通过dlclose等共享库或进程退出时引用计数减 一当减少到0时系统卸载共享库。头文件1#include dlfcn.h相关函数介绍(1)打开动态链接库dlopen12345678910111213函数原型void *dlopen (const char *filename, int flag);flag分为这两种RTLD_NOW在dlopen返回前解析出全部没有定义的符号解析不出来返回NULL。RT_GLOBAL动态库定义的符号可被其后打开的其他库解析。RT_LOCAL和上面相反不能被其他库解析。默认。RTLD_LAZY暂缓决定等有需要时再解出符号返回值:打开错误返回NULL成功返回库引用dlopen用于打开指定名字(filename)的动态链接库(最好文件绝对路径)并返回操作句柄。(2)取函数执行地址dlsym123函数原型void *dlsym(void *handle, char *symbol);dlsym根据动态链接库操作句柄(handle)与符号(symbol)返回符号对应的函数的执行代码地址。(3)关闭动态链接库dlclose1234函数原型int dlclose (void *handle);returns 0 on success, and nonzero on error.dlclose用于关闭指定句柄的动态链接库只有当此动态链接库的使用计数为0时,才会真正被系统卸载。(4)动态库错误函数dlerror123函数原型const char *dlerror(void);当动态链接库操作函数执行失败时dlerror可以返回出错信息返回值为NULL时表示操作函数执行成功。示例123456789101112131415161718192021222324#include stdio.h#include dlfcn.hint main(int argc, char **argv) {void *handle;double (*cosine)(double);char *error;handle dlopen (/tmp/libtest.so, RTLD_LAZY);if(!handle) {fprintf (stderr,%s , dlerror());exit(1);}cosine (double(*)(double))dlsym(handle,cos);if((error dlerror()) ! NULL) {fprintf (stderr,%s , error);exit(1);}printf(%f , (*cosine)(2.0));dlclose(handle);return0;}编译编译动态库命令1g -o libtest.so -rdynamic -shared -fPICtest.cpp编译主程序命令1g -o mainTest mainTest.cpp -rdynamic -ldl注意要加-ldl 和 -rdynamic 链接选项总结以上为个人经验希望能给大家一个参考