库:
是编程中“预先写好的代码的工具箱”,用途在于:减少重复定义的问题
库的优点:
1、别人直接用,不需要额外编译,防止编译环境不同
2、不希望别人知道自己.c的内容
静态库:libxxx.a
编译好的二进制代码的集合,本质上是多个目标文件(.o)的打包归档
静态库特点:
如果根据库编译出来的可执行程序,就算库删除了,也能继续执行
创建静态库的方式:
-L后面在库所在的位置 -l后面跟库的名称(只需不同部分)
ar crv libfool.a main.o max.o add.o
windows:后缀为.lib
如果将库放置在系统库中(/usr/lib)中,则在gcc编译阶段不需要加-L指明位置,只需要-l说明添加的库
静态库优点:
如果库不经常进行改动维护,那么生成的可执行程序使用较久
动态库:libxxx.so(共享库windows)
生成共享库的指令
gcc -shared -fPIC -o libxxx.so add.o main.o max.o
动态库文件:
可以被多个程序动态加载和共享的文件
动态库后缀(windows .dll)
-shared :
告诉编译器将目标文件加载成动态库
-fPIC:
生成位置无关代码(动态库的特性)代码不依赖于特定的内存地址,无论动态库加载到内存的什么位置,都能正常执行
动态库在程序运行时由操作系统分配内存地址,而不是编译的时候固定地址
动态库编译出的代码无法直接运行
ldd:
查看可执行程序使用了哪些动态库
动态库优点:
适合更新频繁的程序,只需要找到动态库的位置即可,可执行程序大小相较于静态库生成的可执行文件较小
找不到库:
解决方法:
1、将共享库拷贝到标准目录下(usr/lib)
当动态库被删除时,原本能执行的可执行程序就没办法执行了
2、告诉程序,该动态库就在当前目录下