创建静态库
Makefile文件
mymath.c文件
mymath.h文件
编译main.c文件
gcc 编译时会把在系统目录中寻找头文件和库文件,文件不在系统目录中用参数
-I 头文件所在文件夹/ -L 库的地址文件夹 -l+除去lib和后缀。
拷贝文件到系统目录即可不用参数
库的安装类似于把头文件和库文件拷贝到系统文件中
库可以提供一个全局变量,如errno就是C语言提供的
如果系统默认动态链接,只提供静态链接,gcc只能提供静态链接。
动态库
动态库在程序运行时被加载到内存,所以产生库的方式和产生可执行程序的命令类似
同时连接动静库
可执行程序链接动态库,必须让加载器和gcc编辑器同时知道位置,方法如下
方法一:把动态库拷贝到系统目录/lib64/usr/lib64
方法二:在系统目录创建软链接指向动态库
方法三:环境变量$LD_LIBRARY_PATH系统搜索动态库路径,将路径添加到这个变量里
方法四:/etc/ld.so.conf.d建立自己的路径动态库路径配置文件,然后重新ldconfig即可。
动静态库区别
静态库相当于把代码拷贝到可执行程序中,当可执行程序链接后,删掉静态库依然可以运行。
动态库相当于程序运行时跳出来运行动态库的代码,动态库删除后,程序不能运行。
动态库在系统中加载之后,会被所有的程序共享,在内存中只会被加载一份。
动态库加载
一份动态库加载到内存中通过页表映射加载到多个进程地址空间的共享区,正文代码运行到库的时候进入共享区。
执行的代码都是在进程地址空间进行执行。
系统在运行时,一定会存在多个动态库,通过os管理起来
动态库的数据会发生写时拷贝,如全局变量。
可执行程序编译完后没有加载到自己内存中有自己的地址。程序可以分区并有地址
平坦模式0~4GB,上面的地址并不是真实的物理地址,是逻辑地址