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

静态链接和动态链接

      静态链接动态链接是两种将可执行文件与库进行链接的方式。它们的主要区别体现在链接时机、可执行文件的大小以及运行时的灵活性上。

1.静态链接

在静态链接中,所有需要的库(例如 C 标准库 libc)都会在编译时被复制并嵌入到最终的可执行文件中。链接器将所有库的代码与程序的代码整合成一个独立的可执行文件。

特点:
  1. 编译时链接:库代码在编译时就被打包到可执行文件中。
  2. 可执行文件独立性:生成的可执行文件不依赖外部库,完全自包含。即使目标系统没有安装相关的库,也可以运行。
  3. 文件大小较大:因为所有需要的库代码都嵌入到了可执行文件中,所以生成的可执行文件通常较大。
  4. 性能稍好:由于所有代码都在同一个文件中,程序启动时不需要额外加载库,启动时间可能更快。
  5. 库更新复杂:如果库需要更新或修补错误,必须重新编译整个程序,更新相对麻烦。
静态链接的示例:
gcc -static -o my_program my_program.c

这里的 -static 选项告诉 gcc 使用静态链接方式生成可执行文件。

2. 动态链接

在动态链接中,程序在运行时会依赖于外部共享库(如 .so 文件,"shared object"),并在运行时将这些库加载到内存中。动态库的代码不直接嵌入到可执行文件中,而是通过动态链接器在运行时加载。

特点:
  1. 运行时链接:库代码在程序运行时才会加载到内存中。
  2. 可执行文件依赖共享库:生成的可执行文件较小,但依赖于目标系统上的外部共享库。如果库文件在目标系统中缺失,程序无法运行。
  3. 文件大小较小:因为库没有嵌入到可执行文件中,所以可执行文件的大小通常较小。
  4. 灵活性高:库可以独立于可执行文件进行更新。如果库有错误,可以直接更新库文件,无需重新编译程序。多种程序还可以共享同一个动态库,节省内存。
  5. 加载时间稍长:程序运行时需要加载共享库,程序启动时间可能稍微变长。
动态链接的默认方式:

如果你没有指定 -static 选项,gcc 默认会使用动态链接方式:

gcc -o my_program my_program.c

3. 静态链接和动态链接的对比

4. 使用场景

  • 静态链接

    • 当你想要生成完全自包含的可执行文件时(例如发布到没有安装特定库的环境中,或对库的版本不确定时),静态链接是理想选择。
    • 在嵌入式系统、资源受限的环境中,静态链接有时也是必要的,因为这些环境可能不支持动态链接库。
  • 动态链接

    • 当你希望减少可执行文件的大小,或多个程序可以共享同一个库以减少内存占用时,动态链接更为合适。
    • 对于系统库经常更新的程序,动态链接可以在不重新编译程序的情况下,更新共享库以修复漏洞或优化性能。

5. 总结

  • 静态链接:库代码在编译时嵌入到可执行文件中,生成的文件较大,独立性强,但更新不灵活。
  • 动态链接:库在运行时加载,生成的文件较小,依赖外部库,更新灵活,但依赖目标系统的环境配置。
http://www.lryc.cn/news/431067.html

相关文章:

  • 构建智能门禁安防系统:树莓派 4B、OpenCV、SQLite 和 MQTT 的应用(代码示例)
  • 基于 Konva 实现Web PPT 编辑器(二)
  • 【开源免费】基于SpringBoot+Vue.JS在线竞拍系统(JAVA毕业设计)
  • Qt TabWidget添加多个窗口,实现分页窗体布局
  • HarmonyOS开发实战( Beta5版)合理使用动画丢帧规范实践
  • 基于BiLSTM-CRF的医学命名实体识别研究(下)模型构建
  • 5.sklearn-朴素贝叶斯算法、决策树、随机森林
  • VMWARE VCENTER6.7 VCSA通过Web5480进行版本升级
  • GIT使用常见问题
  • 内核链表
  • 行空板上YOLO和Mediapipe视频物体检测的测试
  • 【Spring Boot 3】【Web】ProblemDetail
  • 市占率最高的显示器件,TFT_LCD的驱动系统设计--Part 1
  • Linux基础 -- 获取CPU负载信息
  • Django 中的用户界面 - 创建速度计算器
  • spring security 如何解决跨域的
  • 日志系统前置知识
  • 【Spring Boot 3】【Web】全局异常处理
  • Dcoker 运行es
  • 7系列FPGA HR/HP I/O区别
  • sqli-labs靶场通关攻略(五十一到六十关)
  • c语言中的动态内存管理
  • 生信机器学习入门4 - scikit-learn训练逻辑回归(LR)模型和支持向量机(SVM)模型
  • COD论文笔记 Adaptive Guidance Learning for Camouflaged Object Detection
  • 9.5LeetCode
  • 数据仓库系列13:增量更新和全量更新有什么区别,如何选择?
  • 数据 结构(内核链表)
  • 学习node.js十三,文件的上传于下载
  • 【刷题笔记】删除并获取最大点数粉刷房子
  • 【Linux 从基础到进阶】Elasticsearch 搜索服务安装与调优