1.库文件
1.1库文件介绍
库是一组预先编译好的方法的集合。Linux系统存储的库的位置一般在:/lib 和 /usr/lib。 在 64 位的系统上有些库也可能被存储在/usr/lib64 下。库的头文件一般会被存储在 /usr/include 下或其子目录下。 库有两种,一种是静态库,其命令规则为 libxxx.a,一种是共享库,其命令规则为 libxxx.so
示例:c的printf()函数声明存在于<stdio>头文件中,实现存在库中,库的作用就是存放编译好的方法集合
1.2库文件的分类
库文件可以分为静态库,共享库(windows里面称作为动态链接库)
静态库后缀名 :libxx.x
共享库(动态链接库):libxx.so
(xx泛指库文件的统一类型名简称)
1.3静态库的生成和使用
ar crv (需要生成的静态库名称) (里面需要包含的文件)
里面需要包含的文件类型,通常是源代码经过编译产生的二进制代码
生成静态库示例
使用静态库示例
-L 代表需要访问的静态库地址
-l 代表需要访问的静态库名称
1.4共享库的生成方法
gcc -shared -fPIC (需要生成的静态库名称) (里面需要包含的文件)
生成共享库示例
使用共享库示例
编译完毕后无法运行main,提示找不到共享库
需要将生成的共享库移动到 /usr/lib中
共享库生成后,编译完毕,生成可执行程序 可执行程序不可以正常运行,涉及到下面需要提到的静态库和共享库的区别。
1.5静态库共享库区别
1.程序编译区别
静态库在程序编译的时候,会将静态库里面包含的方法实现拷贝一份在可执行程序中,继而使用静态库编译的程序在程序编译完毕后删除静态库后仍然可以正常运行
共享库在程序编译的时候,可执行程序会标记共享库,在程序需要运行的时候去搜索共享库(linux 中默认搜索路径是 /usr/lib)中
2.装载时机区别
共享库装载时机
在lib库中 如果存在 libfoo.a libfoo.so 两种库,包含的内容相同,但是库的类型不同时,会优先使用共享库,使用共享库的逻辑时在执行一个可执行程序的时候,如果需要使用libfoo.so 共享库,内存会将该共享库加载到内存中,直到程序结束才会释放加载该共享库所消耗的内存。如果多个可执行程序都需要依赖该共享库,则是等所有依赖该共享库的可执行程序执行完毕才会释放加载共享库的内存
静态库装载时机
静态库随着程序编译一起被装载在可执行程序当中
共享库比较于静态库生成的可执行程序在代码量非常大的时候作用更加明显