#include <dlfcn.h>
/**
* dlopen 打开动态链接库
* @filename:要加载的共享库的路径,通常以 .so 结尾。
* @flag:加载选项,可以是以下值的组合:
* RTLD_LAZY:延迟解析符号,只有在实际使用时才解析。
* RTLD_NOW:立即解析所有未定义符号。
* RTLD_GLOBAL:使得库中的符号在后续的 dlopen 调用中可见。
*
* return:
* 成功时返回一个指向共享库的句柄(void* 类型)。
* 失败时返回 NULL,并可以通过 dlerror() 获取错误信息。
*/
void* dlopen(const char* filename, int flag);
// 实例
// main.c
#include <stdio.h>
#include <dlfcn.h>
int main() {
void* handle;
void (*hello)();
// 加载共享库
handle = dlopen("./libmylib.so", RTLD_LAZY);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
return 1;
}
// 清除之前的错误
dlerror();
// 获取函数指针
*(void **) (&hello) = dlsym(handle, "hello");
const char *dlsym_error = dlerror();
if (dlsym_error) {
fprintf(stderr, "%s\n", dlsym_error);
dlclose(handle);
return 1;
}
// 调用函数
hello();
// 关闭共享库
dlclose(handle);
return 0;
}
编译动态库
# -fPIC 这个选项表示生成位置无关代码(Position Independent Code)。
# 位置无关代码是指可以在内存中的任何地址加载和执行的代码,这是创建共享库所必需的。
gcc -shared -o libmylib.so -fPIC mylib.c