链接和库整理

静态链接 vs 动态链接

  1. 静态链接(Static Linking)

    定义:

    在编译时将库代码直接复制到最终的可执行文件中

    特点:

    生成的可执行文件包含所有需要的库代码

    程序运行时不再依赖外部的库文件

    可执行文件体积较大

  2. 动态链接(Dynamic Linking)

    定义:

    在程序运行时才加载所需的库

    特点:

    可执行文件只包含对库的引用,不包含库代码本身

    程序运行时需要相应的库文件存在

    可执行文件体积较小

    多个程序可以共享同一个库的实例

静态库 vs 动态库

  1. 静态库(Static Library)

    文件扩展名:

    Unix-like系统:.a (Archive)

    Windows系统:.lib

    创建方式:

    Unix-like:ar rcs libxxx.a obj1.o obj2.o

    Windows:使用lib.exe工具

    使用方式:

    在链接阶段被完全整合到可执行文件中

    优点:

    程序部署简单,不需要额外的库文件

    执行速度快(无运行时加载开销)

    版本兼容性问题少

    缺点:

    可执行文件体积大

    库更新需要重新编译整个程序

    多个程序无法共享库代码(内存浪费)

  2. 动态库(Dynamic Library)

    文件扩展名:

    Unix-like系统:.so (Shared Object)

    Windows系统:.dll (Dynamic Link Library)

    macOS:.dylib

    创建方式:

    Unix-like:gcc -shared -o libxxx.so obj1.o obj2.o

    Windows:cl /LD xxx.cpp

    使用方式:

    编译时链接(程序知道需要哪些符号)

    运行时加载(实际代码在运行时才载入内存)

    优点:

    可执行文件体积小

    库更新不需要重新编译主程序

    多个程序可以共享同一个库实例(节省内存)

    支持插件式架构

    缺点:

    部署复杂(需要确保目标系统有正确版本的库)

    存在DLL Hell问题(版本冲突)

    轻微的性能开销(运行时加载)

技术细节对比

特性 静态链接/静态库 动态链接/动态库
文件大小 较大 较小
内存使用 每个程序独立占用 多个程序可共享
部署复杂度 简单(单文件) 复杂(需附带库文件)
更新方式 需重新编译 可单独更新库
加载时机 编译时 运行时
执行速度 略快(无加载开销) 略慢(有加载开销)
版本兼容性 无问题 可能有问题
适用场景 小型工具、嵌入式系统 大型应用、系统组件
相关推荐
luj_17682 小时前
大律师考核应重能力与科技素养
c语言·开发语言·c++·经验分享·算法
刃神太酷啦2 小时前
Linux 系统 MySQL 完整安装配置教程:从卸载 MariaDB 到优化 my.cnf----《Hello MySQL!》(1)
android·linux·c语言·c++·mysql·leetcode·mariadb
汉克老师5 小时前
CSP-J 初赛(以满分为目标):第十五课《结构体、排序与自定义比较——从“给数字排队”到“给一群人排队”》
c++·csp-j·小学生·学c++编程
HugoStudio_SWAN6 小时前
C++ CMD 互动动画:按键触发爆炸效果
开发语言·c++·学习·程序人生
水饺编程6 小时前
第5章,[Win32 章节] :Polygon 函数和多边形填充模式
c语言·c++·windows·visual studio
wuminyu6 小时前
Java FFM处理网络读写事件源码剖析
java·linux·c语言·jvm·c++
一木 之林7 小时前
C/C++ 面向对象编程(OOP)(进阶)
java·c语言·c++
千谦阙听8 小时前
C++篇:类和对象(上)
开发语言·c++
_Narcissus_9 小时前
分治&递归
数据结构·c++·笔记·算法·leetcode·递归·分治
牛油果子哥q9 小时前
C++ Socket精讲:TCP/UDP套接字、客户端服务端实现、字节序、粘包拆包、简单HTTP服务、网络踩坑与面试全解
网络·c++·tcp/ip