一、什么是动态库?

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

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

二、如何制作动态库

1、先编译成*.o文件

ios 动态库检查 动态库的使用_可执行

2、生成动态库

ios 动态库检查 动态库的使用_可执行程序_02

3、编译可执行程序

ios 动态库检查 动态库的使用_可执行_03

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

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

ios 动态库检查 动态库的使用_可执行_04

或者

ios 动态库检查 动态库的使用_可执行_05

5、执行可执行程序

ios 动态库检查 动态库的使用_ios 动态库检查_06

无法成功!

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

5、解决方法

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

ios 动态库检查 动态库的使用_动态库_07

其他有效解决方法


三、抛出问题?

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

ios 动态库检查 动态库的使用_动态库_08

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

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

假如程序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