> 技术文档 > 【Linux】动态库丢了程序就崩?一文讲清动态 / 静态库区别 + Linux 静态库安装教程

【Linux】动态库丢了程序就崩?一文讲清动态 / 静态库区别 + Linux 静态库安装教程

在这里插入图片描述

🔥个人主页IF’Maxue-CSDN博客
|
🎬作者简介:C++研发方向学习者
|

📖个人专栏
《C语言》 | 《C++深度学习》|《Linux》 |《数据结构》|《数学建模》
|
⭐️人生格言:生活是默默的坚持,毅力是永久的享受。不破不立,远方请直行!

文章目录

  • 程序的\"共享工具箱\":动态库与静态
    • 一、不同系统里的库长啥样?
    • 二、用gcc编译时怎么用这些库?
      • 1. 默认是动态链接
      • 2. 强制静态链接用`-static`
      • 3. Linux静态库可能需要单独安装
    • 三、动态链接和静态链接有啥区别?
      • 动态链接:\"借工具\"模式
      • 静态链接:\"买工具回家\"模式
    • 总结一下

程序的\"共享工具箱\":动态库与静态库

写程序就像搭积木,除了自己做的零件,还会用到现成的标准零件——这些零件就打包在\"库\"里。库是预先编译好的可重用代码集合,包含函数、类、变量等,可以大大提高开发效率。今天就聊聊两种最常用的库:动态库和静态库,以及它们在不同系统里的样子和用法。

一、不同系统里的库长啥样?

库在Windows和Linux里长的\"名字\"不一样,但功能类似。理解这些命名规则对开发很重要:

  • Linux系统

    • 动态库(共享库):文件名格式是libXXX.so(比如libtest.so),其中.so代表\"Shared Object\"
    • 静态库:文件名格式是libXXX.a(比如libtest.a),其中.a代表\"Archive\"
  • Windows系统

    • 动态库:文件名是XXXX.dll(比如test.dll),DLL即\"Dynamic Link Library\"
    • 静态库:文件名是XXXX.lib(比如test.lib),LIB即\"Library\"

【Linux】动态库丢了程序就崩?一文讲清动态 / 静态库区别 + Linux 静态库安装教程

注意看:不管文件名怎么写,真正的库名是中间的XXX。比如libabc.so的库名是abccalc.dll的库名是calc——相当于去掉文件名的前缀(lib)和后缀(.so/.a/.dll/.lib)。这种命名约定方便开发工具自动识别和查找库文件。

在实际开发中,我们经常需要指定库的搜索路径。Linux下可以通过设置LD_LIBRARY_PATH环境变量,Windows下可以通过修改PATH环境变量来指定动态库的搜索路径。

【Linux】动态库丢了程序就崩?一文讲清动态 / 静态库区别 + Linux 静态库安装教程

二、用gcc编译时怎么用这些库?

我们写C程序时,经常会用到系统自带的\"C标准库\"(比如printf()函数就来自这里)。gcc编译时会自动处理这些库的链接:

1. 默认是动态链接

平时编译程序,gcc默认用动态链接方式:

gcc hello.c -o hello

这样生成的hello文件很小(通常只有几十KB),因为它没把库的代码装进去,只是记录了\"运行时需要找XXX库\"。程序运行时,操作系统会按以下顺序查找动态库:

  1. 编译时指定的rpath路径
  2. LD_LIBRARY_PATH环境变量指定的路径
  3. /etc/ld.so.cache中缓存的路径
  4. 默认的系统库路径(/lib和/usr/lib等)

【Linux】动态库丢了程序就崩?一文讲清动态 / 静态库区别 + Linux 静态库安装教程

2. 强制静态链接用-static

如果想把库的代码直接\"打包\"进程序,加-static选项:

gcc -static hello.c -o hello_static

这时hello_static会大很多(可能达到MB级别),因为它把需要的库代码全拷贝进来了。静态链接的过程包括:

  1. 将静态库解压到临时目录
  2. 只提取需要的目标文件
  3. 将这些目标文件和程序代码一起链接成最终可执行文件

静态链接的程序具有更好的可移植性,适合在嵌入式系统或需要高度独立性的环境中使用。

【Linux】动态库丢了程序就崩?一文讲清动态 / 静态库区别 + Linux 静态库安装教程

3. Linux静态库可能需要单独安装

Linux系统通常默认装动态库,用-static编译报错时,可能是缺静态库。比如安装C标准静态库:

sudo apt install libc6-dev-i386 # 32位系统sudo apt install libc6-dev # 64位系统

在开发过程中,可以使用ldd命令查看程序的动态库依赖关系:

ldd hello

【Linux】动态库丢了程序就崩?一文讲清动态 / 静态库区别 + Linux 静态库安装教程

三、动态链接和静态链接有啥区别?

动态链接:\"借工具\"模式

程序运行时才去\"借\"动态库的功能,多个程序可以共享一个动态库。动态链接的工作流程:

  1. 程序加载时,操作系统检查其依赖的动态库
  2. 在内存中查找是否已加载这些库
  3. 如果未加载,则从磁盘加载到内存
  4. 解析程序中的符号引用

【Linux】动态库丢了程序就崩?一文讲清动态 / 静态库区别 + Linux 静态库安装教程

优点:

  • 省空间:一个库能被多个程序共用
  • 易更新:更新库无需重新编译程序
  • 内存效率:多个程序可共享同一份库代码

缺点:

  • 依赖强:动态库丢了(比如误删),程序就跑不了
  • 版本问题:不同程序可能依赖不同版本的库
  • 启动稍慢:需要加载和解析动态库

静态链接:\"买工具回家\"模式

编译时直接把库的代码拷贝进程序,自己带全了所有需要的功能。静态链接的工作流程:

  1. 链接器收集所有需要的目标文件
  2. 解析符号引用
  3. 重定位符号地址
  4. 生成完整的可执行文件

【Linux】动态库丢了程序就崩?一文讲清动态 / 静态库区别 + Linux 静态库安装教程

优点:

  • 不挑环境:拿到任何电脑上都能跑
  • 性能略好:函数调用不需要间接寻址
  • 启动更快:无需加载额外库文件

缺点:

  • 费空间:每个程序都带一份库代码,文件会很大
  • 更新困难:库更新需要重新编译程序
  • 内存浪费:多个程序不能共享同一份库代码

总结一下

【Linux】动态库丢了程序就崩?一文讲清动态 / 静态库区别 + Linux 静态库安装教程

选择建议:

  • 开发桌面应用:通常使用动态链接,便于更新和维护
  • 开发服务器应用:根据需求选择,动态链接更常见
  • 嵌入式开发:多使用静态链接,减少依赖
  • 库开发者:同时提供动态和静态版本

简单说:动态库像公共充电宝,大家共享但不能丢;静态库像自己买的充电宝,随时能用但占地方。根据需求选就行——想省空间用动态库,想程序到处能跑用静态库。在实际项目中,常常会混合使用两种链接方式,关键部分静态链接,非关键部分动态链接,达到最佳平衡。