目录
3、通过设置环境变量指定库的默认查找路径 + -lname
3、通过设置环境变量指定库的默认查找路径 + -lname
1、库的概念
- 库是一个二进制可执行文件,需要被载入到内存中使用,不能单独运行 2、每个操作系统都有自己的库
2、库的分类
- 静态库 libxxx.a(Linux) *.lb(windows) 动态库 libxxx.so(Linux) *.llb(windows)
3、库存在的意义
- 把代码封装成库是为了方便使用,方便管理,安全性高,保密性强,提高代码移植效率
4、静态库的原理及优缺点
- 在程序编译到链接库时,把静态库函数继承(拷贝二进制指令)到二进制文件中,生成可执行文件
- 优点:运行速度快 编译成功后,程序可以脱离静态库,
- 缺点:可执行文件相对较大 当静态库修改后,可执行文件就需要重新编译
5、静态库的制作及使用
制作静态库:
1、编译出目标文件:
gcc -c code.c
2、打包目标文件生成静态库文件:
ar -r libname.a a.o b.o c.o...
注意:静态库文件名字前缀(lib)、后缀(.a)不能改变
使用静态库:
1、直接使用:
gcc code.c libname.a
2、指定库文件的查找位置:
-L 指定库的路径 -l指定库名(去掉前缀和后缀的name)
gcc code.c -L/path -l name
3、通过设置环境变量指定库的默认查找路径 + -lname
- 打开操作系统配置文件: vim ~/.bashrc(有vim编辑器的情况下)
- 在文件末尾追加: export LIBRARY PATH=$LIBRARY_PATH:/path
- 保存退出重新加载配置文件: source ~/.bashrc 然后可以把静态库文件libname.a放入/path中
- 使用时: gcc code.c -lname
6、动态库的原理及优缺点
- 当运行程序时,会把动态库一起加载到内存中(内存中如果不存在,则会把动态库加载到内存中),调用共享库函数,函数名就是记录了他在共享库中的位置,本质上是跳转到动态库中的对应位置执行
- 优点:可执行文件相对较小,当动态库修改后,可执行文件不需要重新编译
- 缺点:与静态库相比,运行速度较慢,需要依赖共享库文件
7、动态库的制作及使用
制作动态库:
1、编译生成目标文件:
gcc -fpic -c code.c
2、生成动态库:
gcc -shared -fpic a.o b.o... -o libname.so
使用动态库:
1、直接编译使用
gcc code.c libname.so
注意:只能编译成功,如果想要使用,需要把动态库放入系统指定库加载路径
2、指定库文件的查找位置 :
-L指定库的路径 -l指定库名(去掉前缀和后缀的name)
gcc code.c -L /path -l name
3、通过设置环境变量指定库的默认查找路径 + -lname
注意:
a. 运行动态库时,会去默认路径加载动态库,也可通过设置环境变量的方法,增加加载共享库的加载路径,方法和静态库设置环境变量相同
b. 编译时,如果同时存在同名的共享库与静态库,编译器会优先使用共享库,加上 -static 编译参数,优先使用同名的静态库
8、静态库和动态库的区别(重点)
静态库:
1、libname.a格式命名
2、在程序编译时,直接将静态库拷贝到可执行程序中,因此可执行文件比较大
3、可执行程序脱离静态库后不受影响
4、静态库修改后,程序需要重新编译生成新的可执行文件
动态库:
1、libname.so格式命名
2、可执行程序编译时,不会连接到动态库,而是在程序执行的时候,将动态库加载到内存中,内存中最多只有一份,可执行程序比较小
3、脱离动态库后,可执行程序会崩溃
4、动态库修改后,不需要重新编译程序