基本概念
- 静态库
- 在编译程序的时候把这个库的内容加载到程序中。
- 优点: 程序以后就不需要依赖库、执行效率有所提高
- 缺点: 浪费一定的程序空间,无法对用户进行升级迭代
- 动态库
- 编译时程序只是确认一下库中的接口是否合适匹配,并没有拷贝任何的代码,所以程序较小。
- 优点: 节省一定的存储空间,后期对项目的升级迭代留下接口
- 缺点: 程序运行时依赖于库文件、执行效率有所降低
- 库文件的命名
- 必须以lib开头作为前缀 比如 : libz.so liba.so libk.so.1.0.9.12
- 静态库一般以 .a 作为后缀 , 动态库一般以.so 作为后缀
- 库的名称是去除前缀和后缀 取中间的单词
如何制作库文件
无论是静态库还是动态库都需要.o作为原材料。
静态库制作:
1. 获得对应功能的.o文件
$ gcc show_ui.c -o show_ui.o -c -fPIC -I../INC // -fPIC 告诉编译器生成一个跟地址无关的二进制文件
$ gcc oper.c -o oper.o -c -fPIC -I../INC
$ gcc get_input.c -o get_input.o -c -fPIC -I../INC
2. 把刚才获得的3个.o文件柔和成一个库文件
$ ar rcs libmaster.a *.o
3. 程序编译
gcc main.c -o ../BIN/main -I../INC -L./ -lmaster gcc
-I../INC // 指定头文件路径 -L./ // 指定库文件路径 -lmaster // 需要链接的库名
动态库制作:
1. 跟静态库一样先准备好.o文件
2. 制作动态库
$ gcc -shared -fPIC -o libmaster.so *.o // 使用所有的.o文件来统一生成一个动态链接库libmaster.so //-shared 生成共享库
3. 运行程序
$ ./main1 ./main1: error while loading shared libraries: libmaster.so: cannot open shared object file: No such file or directory
错误原因:因为还没有告诉程序动态库文件在哪里,所以报错
解决方法:
方法1 : [ 推荐使用 ]
把库文件存放到指定的路径中
/lib 或/usr/lib
sudo cp libmaster.so /lib //把 库拷贝到 库所存放的路径
方法2 :
设置环境变量
1. 使用vim打开
$ vim ~/.bashrc
2. 在文件末尾添加
export LD_LIBRARY_PATH=/home/gec/mylib:$LD_LIBRARY_PATH
3. 从新生效配置脚本
$ source ~/.bashrc
实验发现gcc 默认会选择使用动态库 , 也可手动要求使用静态编译程序