dlopen()和dlsym()

我们都知道,为了减少代码的尺寸,我们会尽量将代码封装到动态库里面,比如我们将吃饭(have_meal())、理发(hair_cut())封装在一个叫 life 的动态库里:liblife1.so通常,我们会在使用了这个库代码的程序编译时加上链接选项,例如:
gcc main.c -o main -llife1
这样,程序运行所需要的吃饭(have_meal())、理发(hair_cut())的代码就跟 main.c 程序分离,达到可以给多个程序共用 liblife.so 从而节省代码量的目的,但是这个做法有一个局限性,那就是当吃饭、理发的函数接口不变,但是内部实现功能发生了改变的时候,我们需要重新执行编译命令,或者重新链接不同的库。例如:
gcc main.c -o main -llife2
这样很不方便,那怎样才能不修改源代码,也不需要重新编译 main.c,直接让程序运行的时候动态地决定呢? 答案就是使用动态链接动态库。
在 main.c 中,这么写你的代码:
注意到上面的提薪大招了吗? dlopen()和dlsym(),dlopen用来指定动态库,并使用dlsym来获取动态库里面的某一函数(比如 hava_meal),这样一来,只要传给 main 的参数 argv[1]不同,就可以获取和链接不同的动态库,只要这些函数接口一样即可。例如上面的例子,在运行 main 程序的时候,就变成:
./main liblife1.so (调用 life1 里面的吃饭、理发的函数)
./main liblife2.so (调用 life2 里面的吃饭、理发的函数)
至此,问题完美解决。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值