链接和库整理

静态链接 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问题(版本冲突)

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

技术细节对比

特性 静态链接/静态库 动态链接/动态库
文件大小 较大 较小
内存使用 每个程序独立占用 多个程序可共享
部署复杂度 简单(单文件) 复杂(需附带库文件)
更新方式 需重新编译 可单独更新库
加载时机 编译时 运行时
执行速度 略快(无加载开销) 略慢(有加载开销)
版本兼容性 无问题 可能有问题
适用场景 小型工具、嵌入式系统 大型应用、系统组件
相关推荐
汉克老师12 小时前
GESP2026年9月认证C++三级( 第三部分编程题(2、分割字符串))精讲
c++·gesp·小学生·学c++编程
估值探索者12 小时前
【Python量化系统工程化 #08】关了 SSH 就停?systemd 让脚本开机自启 + 异常自动拉起
java·c++·人工智能·分类·数据挖掘
天若有情67312 小时前
C++花式魔改!手写头文件复刻Java语法,彻底打破编码思维定式
java·c++·语言做语言·jac++
qq_1998868712 小时前
第7板块·第3节:CUTLASS 的 GEMM 实现与优化策略
c++·人工智能·gpu算力·cuda
hetao173383713 小时前
2026-09-17 hetao1733837 的刷题记录
c++·算法
shada14 小时前
Boost.Process v2 在旧内核上报 `assign: Bad file descriptor`
c++
别动我齐刘海14 小时前
ROS2 Jazzy + C++ 实战路线——基础学习2
c++·人工智能·vscode·python·学习·机器学习·机器人
朝朝辞暮i15 小时前
C++第 2 课
c++
代码中介商15 小时前
C++ 预约系统实战(三):服务端实现——libevent 事件驱动与业务路由
c++·json·c/s
布莱克60516 小时前
C++中的内存分区详解
c++