静态库、动态库文件制作
作者:互联网
基本概念
- 静态库
- 在编译程序的时候把这个库的内容加载到程序中。
- 优点: 程序以后就不需要依赖库、执行效率有所提高
- 缺点: 浪费一定的程序空间,无法对用户进行升级迭代
- 动态库
- 编译时程序只是确认一下库中的接口是否合适匹配,并没有拷贝任何的代码,所以程序较小。
- 优点: 节省一定的存储空间,后期对项目的升级迭代留下接口
- 缺点: 程序运行时依赖于库文件、执行效率有所降低
- 库文件的命名
- 必须以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../INC2. 把刚才获得的3个.o文件柔和成一个库文件
$ gcc get_input.c -o get_input.o -c -fPIC -I../INC
$ ar rcs libmaster.a *.o3. 程序编译
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 ~/.bashrc2. 在文件末尾添加
export LD_LIBRARY_PATH=/home/gec/mylib:$LD_LIBRARY_PATH3. 从新生效配置脚本
$ source ~/.bashrc实验发现gcc 默认会选择使用动态库 , 也可手动要求使用静态编译程序
标签:文件,gcc,..,静态,fPIC,so,动态,制作,INC 来源: https://www.cnblogs.com/ding-ding-light/p/14087753.html