文章目录

  • ​​1. 静态库​​
  • ​​1.1 静态库的制作​​
  • ​​1.2 静态库的使用​​
  • ​​2. 动态库​​
  • ​​2.1 动态库的制作​​
  • ​​2.2 动态库加载失败的原因​​
  • ​​2.3 解决动态库家加载失败问题​​
  • ​​方法一:LD_LIBRARY_PATH​​
  • ​​临时的配置方法​​
  • ​​用户级别​​
  • ​​系统级别​​
  • ​​方法二:/etc/ld.so.cache文件列表​​
  • ​​3. 静态库和动态库的对比​​

1. 静态库

1.1 静态库的制作

什么是库:

1.4~1.9 静态库和动态库_c++

* 静态库在链接阶段被复制到了程序中
* 动态库在运行时由系统动态加载到内存中

* Linux下静态库为.a文件
* Linux下动态库为.so文件

静态库的制作:

1.4~1.9 静态库和动态库_c++_02


制作流程

1.4~1.9 静态库和动态库_静态库_03

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.4~1.9 静态库和动态库_c++_04



1.2 静态库的使用

libcalc.a复制到lib下

1.4~1.9 静态库和动态库_静态库_05

gcc main.c -o app -I ./include/ -l calc -L ./libl

​-i​​​指定搜索head.h路径
​​​-L​​​指定库的路径
​​​-l​​指定库的名字

1.4~1.9 静态库和动态库_linux_06



2. 动态库

2.1 动态库的制作

1.4~1.9 静态库和动态库_c++_07

静态库和动态库区别:

1.4~1.9 静态库和动态库_静态库_08

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能够查询运行需要的环境

1.4~1.9 静态库和动态库_c++_09


进行链接时,动态库的代码不会被打包到可执行文件中,通过动态载入器动态的载入

动态载入器搜索库的绝对路径

搜索库的路径有顺序

因为没有找到库的路径


2.3 解决动态库家加载失败问题

env指令可以查询环境:键值对形式显示

1.4~1.9 静态库和动态库_静态库_10

方法一:LD_LIBRARY_PATH

临时的配置方法

export指令可以添加环境

echo指令可以查看指定环境

ldd指令可以查看对应代码需要的环境

1.4~1.9 静态库和动态库_linux_11

用户级别

重新打开终端,你会发现失效了:

1.4~1.9 静态库和动态库_静态库_12


在家目录下打开​​.bashrc​​,末尾添加环境

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/zdb/linux/lession06/library/lib

source确定

1.4~1.9 静态库和动态库_linux_13

系统级别
  1. 打开​​./etc/profile​​​,添加环境


    成功!中间需要等待一段时间,一下子查询不到环境

方法二:/etc/ld.so.cache文件列表

  1. 打开指定文件
sudo gedit /etc/ld.so.conf
  1. 添加环境
  2. 刷新环境
sudo ldconfig   #刷新


3. 静态库和动态库的对比

1.4~1.9 静态库和动态库_c++_14


静态库和动态库都是在链接阶段做的处理

静态链接方式和动态链接方式

1.4~1.9 静态库和动态库_c++_15

1.4~1.9 静态库和动态库_c++_16

1.4~1.9 静态库和动态库_c++_17

1.4~1.9 静态库和动态库_动态库_18