1. 静态库
1.1 静态库的制作
什么是库:
* 静态库在链接阶段被复制到了程序中 * 动态库在运行时由系统动态加载到内存中 * Linux下静态库为.a文件 * Linux下动态库为.so文件
静态库的制作:
制作流程
sudo apt install tree
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
- 添加环境
刷新环境
sudo ldconfig #刷新
3. 静态库和动态库的对比
静态库和动态库都是在链接阶段做的处理
静态链接方式和动态链接方式