(5条消息) linux-动态库制作与使用_云的小站的博客-CSDN博客
(5条消息) linux-静态库制作与使用_云的小站的博客-CSDN博客
目录
编译区别
使用不同编译的可执行程序。
推荐使用动态链接
动态链接具有以下优缺点
编译区别
动态库:代码不加载到可执行程序中,而是在可执行程序中声明该程序依赖为该动态库。
静态库:一股脑将库加载到可执行程序中。
注意点
一个可执行程序可能用到许多的库,这些库运行有的是静态库,有的是动态库,而我们的编译默认为动态链接库,只有在该库下找不到动态.os的时候才会采用同名静态库
我们也可以gcc设置静态链接程序。
gcc main.c -I ./output/include/ -L ./output/lib/ -lhello -o main_jj -static
虽然可以成功,但是除非想程序独立,否者不要这样使用,否者我们的可执行程序会非常的大。
会发现main_jj非常的大!842k大小
而main_j与main_d 的较小,但是main_j>main_d 因为main_j的libhello是静态库,静态加载到了main_j中。
main_d+libhello.a(代码部分,不包含其他数据) 约等于 main_j;
使用不同编译的可执行程序。
首先我们要了解进程的可执行程序的
程序加载到内存形成进程时也会将动态库一同加载到内存中,在代码执行的过程中遇到库的接口,是就会跳转到共享区中区调用动态库。实现动态调用。
程序加载到内存形成进程时也会将动态库一同加载到内存中,但是静态库的代码是直接拷贝到可执行程序中,并不会加载到内存中,在运行静态库代码时只会在自己的内存块中运行程序,但运行到i静态库接口的时候依旧会跳到共享区,然后再去访问动态库。
完全静态链接的可执行程序所有的代码数据都再自己进程的物理内存中,不依赖任何库,所以不会打开任何库。
推荐使用动态链接
多个进程可以同时依赖一个的动态库,这样该动态库加载到了内存后可以供多个库使用。
当多个进程同时使用动态库,就可大大节约物理内存。动态库:进程=1:n。
如果是静态库就是把库的代码拷贝到进程中,多个静态链接的进程一起加载到内存中,库代码的重复性大大浪费了内存空间 静态库:进程=1:1
动态链接具有以下优缺点:
优点:
- 更加节省内存并减少页面交换;
- 库文件与程序文件独立,只要输出接口不变,更换库文件不会对程序文件造成任何影响,因而极大地提高了可维护性和可扩展性;
- 不同编程语言编写的程序只要按照函数调用约定就可以调用同一个库函数;
- 适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。
缺点:
- 运行时依赖,否则找不到库文件就会运行失败
- 运行加载速度相较静态库慢一些
- 需要对库版本之间的兼容性做出更多处理
动态库的优缺点就是静态库的返向优缺点