C: 动态链接函数介绍

本文介绍了动态链接库的概念,重点讲解了dlopen用于打开库文件、dlsym用于查找并获取函数指针、以及dlclose关闭库句柄的函数。通过RTLD_LAZY模式和dlerror处理错误,展示了动态链接库在编程中的灵活性和高效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景

在传统的静态链接过程中,所有程序所需的函数和符号都被编译进最终的可执行文件中。然而,这种方式有一定的限制。当我们需要更新库的版本或者引入新的功能时,就需要重新编译整个程序。这对于大型项目来说是非常耗时和不便的。

为了解决这个问题,动态链接库应运而生。动态链接库是一种独立于应用程序的可执行文件的代码和数据集合,它可以在运行时加载到内存中,并在多个应用程序中共享。这种方式使得库的更新和扩展变得更加灵活和高效。

头文件 <dlfcn.h> ,常用函数有 dlopen、dlsym、dlclose

二、函数介绍

  1. dlopen()

以指定模式打开动态连接库文件,并返回句柄

extern void *dlopen (const char *__file, int __mode) __THROWNL;
const char *__file : 库文件路径
int __mode : 绑定模式
			TLD_LAZY : 表示使用延迟绑定,当函数第一次被用到时才进行绑定。有助于提高加载动态库的速度。
			RTLD_NOW : 表示当模块被加载时即完成所有函数的绑定工作,如果有任何未定义的符号引用的绑定工作没法完成,那么就返回错误。
  1. dlclose()

关掉句柄

extern int dlclose (void *__handle) __THROWNL __nonnull ((1));
  1. dlsym()

根据动态链接库操作句柄(__handle)与符号(__name), 返回函数指针或变量指针

extern void *dlsym (void *__restrict __handle,
		    const char *__restrict __name) __THROW __nonnull ((2));
  1. dlerror()
extern char *dlerror (void) __THROW;

当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回值为NULL时表示操作函数执行成功

三、示例

库文件

  1. 创建 mylib.c
#ifdef __cplusplus
extern "C"{
#endif

double add(double, double);

#ifdef __cplusplus
}
#endif



double add(double a, double b){
    return a + b * 2;
}
  1. 生成库文件
gcc -fpic -shared mylib.c -o mylib.so
-fpic : GCC编译器生成动态链接库(多个目标文件的压缩包)时,表示各目标文件中函数、类等功能模块的地址使用相对地址,而非绝对地址
-shared : 生成动态链接库

创建测试文件

  1. 创建test.cpp
#include <stdio.h>
#include <dlfcn.h>

typedef double (*calc)(double, double);

int main(){
    char *error;
    void* handle = dlopen("./mylib.so",  RTLD_LAZY);
    calc add = NULL;

    dlerror();

    add = (calc) dlsym(handle, "add");

    if ((error = dlerror()) != NULL)  {
        fprintf(stderr, "%s\n", error);
        return 0;
    }
    
    double a = 3;
    double b = 4;

    double addresult = add(a, b);
    
    printf("add result: %f\n", addresult);
    return 0;

}
  1. 编译
    运行时链接动态库
gcc -rdynamic -o test test.cpp -ldl

结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值