C语言动态库相关

#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值