前言
linux下的生成的动态库和静态库没有windows下方便
linux下gcc编译默认动态链接和release
程序运行后调用动态库
动态库:
程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码
可执行文件里包含的不是库,只是包含用到的函数入口地址一个表
一个动态库链接的可执行文件仅仅包含它用到函数的入口地址的一个表,而不是外部函数所在目标文件的整个机器码
什么加载到内存,准备运行之前
在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接
动态链接的好处
动态库可以在多个程序间共享,所以动态链接库使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存的磁盘空间
编译链接程序链接静态库
静态库:
程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不在需要静态库
生成静态库
1.创建四个文件
main.c add.c sub.c sub.h add.h
2.写好代码
3.然后分别生成 sub.o 和 add.o
gcc -c sub.c -o sub.o
gcc -c add.c -o add.o
4.将sub.o和add.o打包起来生成libmymath.a
ar -rc libmymath.a *.o
5.生成可执行文件a.out
gcc main.c -L. -I. -lmymath
生成动态库
1.用位置无关码生成sub.o和add.o
gcc -fPIC sub.c add.c
2.生成动态库
gcc -shared libmymath *.o
3.生成可执行文件main
gcc main.c -L. -I. -lmymath -o main
4.此时ldd发现main找不到动态库,要修改环境变量。
export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:yourpath
5.这个时候main找到了,完成
动态库和静态库比较
比较空间的占用
静态库–在程序编译链接的时候被链接到可执行文件中
动态库–是在程序运行之后才被加载到内存中,并且加载一个动态库可以供多个程序使用(虚拟内存机制)
动态库节约空间
时间效率
静态库–被链接到可执行文件中后就不再依赖动态库了
动态库–程序运行的时候还需要去内存中调用
静态库节约时间
可移植性
静态库–可执行文件生成后就不在依赖动态库
动态库–可执行文件生成后依然需要动态库,如果动态库没有了,程序不能正常执行。
动态库的可移植性差