当前位置: 首页 > news >正文

动态库与静态库【Linux】

程序编译过程

源代码(.cpp) → 预处理(.i) → 编译(.s) → 汇编(.o) → 链接(可执行文件)

g++ -o main.i -E main.cpp        参数说明:

参数功能输出文件类型
-E仅预处理.i
-S预处理 + 编译.s
-c预处理 + 编译 + 汇编.o
完整流程(预处理→编译→汇编→链接)可执行文件

若省略 -o main.i,预处理结果会默认输出到终端(可通过重定向保存

g++ 对参数顺序无严格要求,-o 参数与源文件名的位置可互换,约定俗成将 -o 参数放在源文件名之前(如 g++ -o hello hello.cpp),以提高可读性。

链接的目的:

将多个目标文件(.o)和库文件合成最终的可执行文件。链接分为两种:【静志链接】和【动态链接】

静态库和动态库

一、区别: 

特性静态库动态库
文件扩展名Linux: .a
Windows: .lib
Linux: .so
Windows: .dll
链接时机编译时直接嵌入可执行文件运行时动态加载到内存
可执行文件独立运行,不依赖外部库需确保动态库存在于系统路径
内存占用库代码复制到每个进程,内存冗余多个进程共享同一内存副本,节省资源
更新维护需重新编译整个程序替换库文件即可生效(需接口兼容)

二、工作原理

 静态库

  1. ‌本质是目标文件(.o)的归档集合,通过 ar 工具打包生成 .a 文件。

  2. 编译时链接器将库代码复制到可执行文件中,导致文件体积较大

生成和使用静态库: 

g++ -c add.cpp -o add.o        # 编译为目标文件
ar rcs libadd.a add.o       # 打包为静态库
g++ main.cpp -L. -ladd -o app # 链接静态库-L.的.表示当前目录,  -l加文件名
./app    #运行可执行文件app

动态库

  • 编译时需添加 -fPIC 生成位置无关代码,确保加载地址灵活。
  • 运行时通过动态链接器(如 ld-linux.so)加载,依赖 LD_LIBRARY_PATH 或系统库路径

生成和使用动态库: 

gcc -fPIC -c add.cpp # 生成add.o文件,一定要加fPIC,表示任意路径都能用
g++ -shared -o libadd.so add.o    #生成动态库
gcc main.c -L. -lcalc -o app          # 链接动态库
export LD_LIBRARY_PATH=. # 设置临时库路径,.表示在当前目录
./app    #运行app文件

编译时候直接使用:g++ mythread.cpp -lpthread -o app

三、适用场景

  • 优先选静态库‌:
    ✅ 需独立分发的嵌入式程序(无外部依赖)
    ✅ 对运行时效率要求苛刻的场景(无动态加载开销)
  • 优先选动态库‌:
    ✅ 多进程共享的公共模块(如系统库)
    ✅ 频繁更新的功能模块(避免重新编译主程序)

四、常见问题

  1. 静态库链接冲突
    若同时存在同名静态库(.a)和动态库(.so),默认优先链接动态库。强制静态链接需指定 -static 或 -Bstatic 参数
  2. 动态库加载失败
    原因包括路径未配置(LD_LIBRARY_PATH)、权限不足或 ABI 不兼容。可通过 ldd app 检查依赖路径。
  3. 位置无关代码必要性
    动态库编译时 -fPIC 是关键,避免加载时修改代码段(违反现代操作系统的 W^X 安全策略)
http://www.lqws.cn/news/531469.html

相关文章:

  • 前端替换打包后文件中的内容方案(可用于渗透测试后将问题版本号清空临时解决方案)
  • 事务相关问题
  • 数学:逆元,同余
  • 热点代码探测确定何时JIT
  • Codeforces Educational Round 180 题解
  • 【25软考网工】第十章 网络规划与设计(2)网络规划与分析、网络结构与功能
  • [按键手机安卓/IOS脚本插件开发] 按键插件调试与判断循环结构辅助工具
  • Jenkins执行Jenkinsfile报错
  • 可用的.gitignore文件
  • LDO的自放电功能
  • UE Universal Camera 相机插件-限制镜头在区域内移动
  • 认识Jacobian
  • 数学:初步了解什么是线性代数?
  • 开发语言漫谈-R语言
  • 超实用AI工具分享——ViiTor AI视频配音功能教程(附图文)
  • LeVERB:利用潜视觉-语言指令进行人形机器人全身控制
  • Oracle数据库捕获造成死锁的SQL语句
  • SDL渲染RGB图像
  • 高通手机跑AI系列之——穿衣试装算法
  • YOLOv10tensorRT推理代码C++
  • 虚拟化测试工具Parasoft Virtualize的两大核心功能及应用
  • 如何写出优秀的单元测试?
  • 【附源码】旅游网站系统设计与实现+SpringBoot + Vue (前后端分离)
  • 设计模式 | 建造者模式
  • 【机器学习深度学习】线性代数
  • 提升开发思维的设计模式(下)
  • Apache 支持 HTTPS
  • 【Linux】软硬链接,动静态库
  • 流程管理整体章程性方案及流程中的各种操作的定义和说明
  • 2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷(四)