我们都知道,为了减少代码的尺寸,我们会尽量将代码封装到动态库里面,比如我们将吃饭(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 里面的吃饭、理发的函数)
至此,问题完美解决。
dlopen()和dlsym()
最新推荐文章于 2024-06-21 10:10:44 发布