动态库的制作和使用

一、什么是动态库?

动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个so文件中,该so包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。(百度百科)

说白了,程序运行时就已经有可执行的代码函数是静态库链接;没有可执行的代码函数就是动态库链接。

二、如何制作动态库

1、先编译成*.o文件

2、生成动态库

3、编译可执行程序

其中-L指定动态库的存放位置

4、查看可执行程序依赖的动态库

或者

5、执行可执行程序

无法成功!

程序运行的时候会去动态库中找可执行的代码,因此在运行前需要告诉程序应该去哪个路径下查找。

5、解决方法

先来个最简单的解决方法,指定查找动态库路径的环境变量LD_LIBRARY_PATH为本工程动态库存放路径。但是这种方法只能当前窗口有效,一旦关闭窗口,需要重新指定。

其他有效解决方法

https://blog.csdn.net/hankerbit/article/details/83834349

三、抛出问题?

加入有两个动态库,两个动态库上都有相同的函数名,但是实现不一样。那程序会去执行哪个函数呢?

从实验得知,程序会先去执行先编译链接到的动态库中的函数,后面的动态库就忽略了。

四、有了静态库链接,为什么还要动态库?

假如程序A调用funA,程序B也调用funA,当使用静态库链接时,程序A中有funA,程序B中也有funA,这样存储空间就是程序A+程序B+2份funA。但是使用动态库链接时,程序编译的时候不会把funA链接到程序中,只有使用时才会动态去找funA(具体怎么查找后续分析),因此存储空间就是程序A+程序B+1份funA。哪个省空间用哪个。那又有一个问题,程序A和程序B都同时调用funA时不会冲突吗?当然不会了,因为此时的动态库通过mmap私有文件映射的方式在内存中,代码段是一段只读的程序。

五、整理后的测试代码

https://github.com/dyh-git/make_lib_dynamic

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值