救命啊救命啊, 两种装载动态链接库的区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了救命啊救命啊, 两种装载动态链接库的区别?相关的知识,希望对你有一定的参考价值。
有一动态链接库libxxx.so, 里面提供了一个sayhello()函数,请问下面两种方式有什么区别?方式一:main.cint main() sayhello(); return 0;gcc -lxxx main.c; --编译连接时使用 -l进行连接这种方式实在不理解, 但也是用得最多的,比如我们的-lpthread -lm等等等。。。若libxxx.so代码变更重新编译, 我们也重新编译main.c会发现其md5值和之前的不一样。方式二:int main() handle = dlopen("libxxx.so", RTLD_NOW); p_sayhello = dlsym(handle, "sayhello"); (*p_sayhello)();gcc -ldl(这个是dlopen的库) main.c --编译连接时不使用 -l进行连接,而是在程序执行时动态打开。这种方式有点在于动态库变化时,不必编译main.c缺点是:1.如果动态库中有很多函数,那么每个函数都要进行dlsym,取出其地址十分麻烦 2.请补充
我知道区别了-l 相当于静态库,仅在链接的时候装载,不过不是合并入主程序本身(区别于静态库),而是直接将动态库的内容装入内存。 如果动态库在程序执行过程中改变了,程序依然使用的内存中的库。也就是所动态库的后继变更仅仅体现在so这里面,但是主程序在执行的时候依然使用内存中的动态库。dlopen 则是每次都直接从文件系统重新装载动态库。 参考技术A 回复 2# lrita 这个区别我也知道,请问除此之外还有什么?大佬们救命啊 在线急等
以上是关于救命啊救命啊, 两种装载动态链接库的区别?的主要内容,如果未能解决你的问题,请参考以下文章
******************救命啊*******************