Linux 动态链接库使用详解
在 Linux 环境下,动态链接库提供了极大的灵活性。它允许程序在运行时加载模块,而不需要重新编译主程序。Apache Web 服务器就是利用这种机制在运行过程中加载模块的典型例子,这使得添加或删除功能时非常便捷。
核心 API 概览
要使用动态链接库,首先需要在代码中包含 <dlfcn.h> 头文件,并在编译时链接 -ldl 库。
dlopen:打开库
void *dlopen(const char *pathname, int mode);
这个函数负责将指定的动态库文件装入内存并返回一个句柄(handle)。
- pathname:库文件的路径,可以是绝对路径或相对路径。
- mode:控制符号解析和可见性的标志位组合。
返回值:成功返回库引用句柄,失败返回 NULL。
dlsym:获取符号地址
void *dlsym(void *handle, const char *symbol);
拿到 dlopen 返回的句柄后,用 dlsym 去查找具体的函数或变量地址。返回值是 void*,通常需要强制转换为对应的函数指针类型才能调用。
dlclose:关闭库
int dlclose(void *handle);
用于卸载之前打开的动态库。只有当该库的使用计数降为 0 时,系统才会真正将其从内存中移除。
dlerror:错误处理
const char *dlerror(void);
当上述操作失败时,dlerror 会返回具体的错误信息字符串。注意,每次调用 dlerror 后会清空之前的错误状态,所以如果 dlopen 失败了,紧接着调用 dlerror 获取原因通常是最稳妥的做法。
关键标志位说明
dlopen 的 mode 参数决定了库的行为,常见的标志包括:
- RTLD_LAZY:暂缓决定。在
dlopen返回前,不立即解析未定义的符号,等到真正调用时才解析。这对变量引用总是立即解析,仅对函数引用有效。

