一、什么是动态库?
动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个so文件中,该so包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。(百度百科)
说白了,程序运行时就已经有可执行的代码函数是静态库链接;没有可执行的代码函数就是动态库链接。
二、如何制作动态库
1、先编译成*.o文件
2、生成动态库
3、编译可执行程序
其中-L指定动态库的存放位置
4、查看可执行程序依赖的动态库
或者
5、执行可执行程序
无法成功!
程序运行的时候会去动态库中找可执行的代码,因此在运行前需要告诉程序应该去哪个路径下查找。
5、解决方法
先来个最简单的解决方法,指定查找动态库路径的环境变量LD_LIBRARY_PATH为本工程动态库存放路径。但是这种方法只能当前窗口有效,一旦关闭窗口,需要重新指定。
其他有效解决方法
三、抛出问题?
加入有两个动态库,两个动态库上都有相同的函数名,但是实现不一样。那程序会去执行哪个函数呢?
从实验得知,程序会先去执行先编译链接到的动态库中的函数,后面的动态库就忽略了。
四、有了静态库链接,为什么还要动态库?
假如程序A调用funA,程序B也调用funA,当使用静态库链接时,程序A中有funA,程序B中也有funA,这样存储空间就是程序A+程序B+2份funA。但是使用动态库链接时,程序编译的时候不会把funA链接到程序中,只有使用时才会动态去找funA(具体怎么查找后续分析),因此存储空间就是程序A+程序B+1份funA。哪个省空间用哪个。那又有一个问题,程序A和程序B都同时调用funA时不会冲突吗?当然不会了,因为此时的动态库通过mmap私有文件映射的方式在内存中,代码段是一段只读的程序。
五、整理后的测试代码