当前位置: 代码网 > 服务器>服务器>Linux > Linux静态库和动态库的区别是什么?一文带你彻底搞懂

Linux静态库和动态库的区别是什么?一文带你彻底搞懂

2026年08月15日 Linux 我要评论
静态动态库把源代码转换成机器读懂的二进制。1.静态库形式:libxxx.a1.1 制作静态库先把源文件(.c,.cpp)进行汇编(-c)得到.o二进制文件,再用ar打包。把打包完的和头文件一起发送给客

静态动态库

把源代码转换成机器读懂的二进制。

1.静态库

形式:libxxx.a

1.1 制作静态库

先把源文件(.c,.cpp)进行汇编(-c)得到.o二进制文件,再用ar打包。把打包完的和头文件一起发送给客户

1.2 静态库使用

当我们得到了一个可用的静态库之后,需要将其放到一个目录中,然后根据得到的头文件编写测试代码,对静态库中的函数进行调用。

# 1. 首先拿到了发布的静态库
	`head.h` 和 `libcalc.a`
	
# 2. 将静态库, 头文件, 测试程序放到一个目录中准备进行测试
.
├── head.h          # 函数声明
├── libcalc.a       # 函数定义(二进制格式)
└── main.c          # 函数测试
# 4. 编译的时候指定库信息
	-l: 指定库所在的目录(相对或者绝对路径)
	-l: 指定库的名字, 掐头(lib)去尾(.a) ==> calc
# -l -l, 参数和参数值之间可以有空格, 也可以没有  -l./ -lcalc
$ gcc main.c -o app -l ./ -l calc

# 查看目录信息, 发现可执行程序已经生成了
$ tree
.
├── app   		# 生成的可执行程序
├── head.h
├── libcalc.a
└── main.c

2.动态库

  • linux:libxxx.so
  • windows:libxxx.dll

2.1 生成动态库

2.2 动态库使用

# 在编译的时候指定动态库相关的信息: 库的路径 -l, 库的名字 -l
$ gcc main.c -o app -l./ -lcalc

# 查看是否生成了可执行程序
$ tree
.
├── app 			# 生成的可执行程序
├── head.h
├── libcalc.so
└── main.c

# 执行生成的可执行程序, 错误提示 ==> 可执行程序执行的时候找不到动态库
$ ./app 
./app: error while loading shared libraries: libcalc.so: cannot open shared object file: no such file or directory

报错信息:找不到动态库

动态库里面代码:只有执行程序用到动态库里面函数,动态库才会加载到内存。

2.3 解决动态库无法加载问题

  • 静态库:编译链接时把代码复制进可执行文件;
  • 动态库:编译链接只做 “登记”,代码在程序运行时才加载进内存。

动态库:可执行程序被执行起来之后:

程序执行的时候会先检测需要的动态库是否可以被加载,加载不到就会提示上边的错误信息

当动态库中的函数在程序中被调用了, 这个时候动态库才加载到内存,如果不被调用就不加载

动态库的检测和内存加载操作都是由动态连接器来完成的

当用户的程序需要加载动态库的时候动态连接器就开始工作了,很显然动态连接器根本就不知道用户通过 gcc 编译程序的时候通过参数 -l指定的路径。

解决方法(最容易)

# 创建软连接
sudo ln -s /xxx/xxx/libxxx.so /usr/lib/libxxx.so

第一个路径:.so的绝对路径

第二个:最好用/usr/lib/libxxx.so

验证

# 语法:
$ ldd 可执行程序名
# 举例:
$ ldd app
    linux-vdso.so.1 =>  (0x00007ffe8fbd6000)
    libcalc.so => /home/robin/linux/3day/calc/test/libcalc.so (0x00007f5d85dd4000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5d85a0a000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f5d85fd6000)  ==> 动态链接器, 操作系统提供

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com