1.4~1.9 静态库和动态库
原创
©著作权归作者所有:来自51CTO博客作者zdb呀的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
- 1.1 静态库的制作
- 1.2 静态库的使用
- 2.1 动态库的制作
- 2.2 动态库加载失败的原因
- 2.3 解决动态库家加载失败问题
- 临时的配置方法
- 用户级别
- 系统级别
- 方法二:/etc/ld.so.cache文件列表
1. 静态库
1.1 静态库的制作
什么是库:
* 静态库在链接阶段被复制到了程序中
* 动态库在运行时由系统动态加载到内存中
* Linux下静态库为.a文件
* Linux下动态库为.so文件
静态库的制作:
制作流程
gcc -c add.c div.c mult.c sub.c
ar rcs libcalc.a add.o sub.o mult.o div.o #生成静态库
1.2 静态库的使用
libcalc.a复制到lib下
gcc main.c -o app -I ./include/ -l calc -L ./libl
-i
指定搜索head.h路径
-L
指定库的路径
-l
指定库的名字
2. 动态库
2.1 动态库的制作
静态库和动态库区别:
zdb@zdb-virtual-machine:~/linux/lession06$ cd calc
zdb@zdb-virtual-machine:~/linux/lession06/calc$ gcc -c -fpic add.c div.c mult.c sub.c
zdb@zdb-virtual-machine:~/linux/lession06/calc$ gcc -shared add.o sub.o div.o mult.o -o libcalc.so
zdb@zdb-virtual-machine:~/linux/lession06/calc$ cd ..
zdb@zdb-virtual-machine:~/linux/lession06$ cd library/
zdb@zdb-virtual-machine:~/linux/lession06/library$ gcc main.c -o main
main.c:2:18: fatal error: head.h: 没有那个文件或目录
compilation terminated.
zdb@zdb-virtual-machine:~/linux/lession06/library$ gcc main.c -o main -I include/
/tmp/ccFuca5B.o:在函数‘main’中:
main.c:(.text+0x38):对‘add’未定义的引用
main.c:(.text+0x58):对‘subtract’未定义的引用
main.c:(.text+0x78):对‘multiply’未定义的引用
main.c:(.text+0x98):对‘divide’未定义的引用
collect2: error: ld returned 1 exit status
zdb@zdb-virtual-machine:~/linux/lession06/library$ gcc main.c -o main -I include/ -L lib/ -l calc
zdb@zdb-virtual-machine:~/linux/lession06/library$ tree
.
├── include
│ └── head.h
├── lib
│ └── libcalc.so
├── main
├── main.c
└── src
├── add.c
├── div.c
├── mult.c
└── sub.c
3 directories, 8 files
zdb@zdb-virtual-machine:~/linux/lession06/library$ ./main
./main: error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory
-
-I
:指定包含头文件路径 -
-L
:指定动态库路径 -
-l
:指定库的名字
2.2 动态库加载失败的原因
ldd能够查询运行需要的环境
进行链接时,动态库的代码不会被打包到可执行文件中,通过动态载入器动态的载入
动态载入器搜索库的绝对路径
搜索库的路径有顺序
因为没有找到库的路径
2.3 解决动态库家加载失败问题
env指令可以查询环境:键值对形式显示
方法一:LD_LIBRARY_PATH
临时的配置方法
export指令可以添加环境
echo指令可以查看指定环境
ldd指令可以查看对应代码需要的环境
用户级别
重新打开终端,你会发现失效了:
在家目录下打开.bashrc
,末尾添加环境
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/zdb/linux/lession06/library/lib
source确定
系统级别
- 打开
./etc/profile
,添加环境
成功!中间需要等待一段时间,一下子查询不到环境
方法二:/etc/ld.so.cache文件列表
- 打开指定文件
sudo gedit /etc/ld.so.conf
- 添加环境
- 刷新环境
3. 静态库和动态库的对比
静态库和动态库都是在链接阶段做的处理
静态链接方式和动态链接方式