链接和库整理

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

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

技术细节对比

特性 静态链接/静态库 动态链接/动态库
文件大小 较大 较小
内存使用 每个程序独立占用 多个程序可共享
部署复杂度 简单(单文件) 复杂(需附带库文件)
更新方式 需重新编译 可单独更新库
加载时机 编译时 运行时
执行速度 略快(无加载开销) 略慢(有加载开销)
版本兼容性 无问题 可能有问题
适用场景 小型工具、嵌入式系统 大型应用、系统组件
相关推荐
C^h8 小时前
c++ string
开发语言·c++
raindayinrain8 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
学逆向的9 小时前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao9 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
小徐不徐说10 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
大都督会赢的10 小时前
C++第一节课
开发语言·c++
UIU11410 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
TMedical11 小时前
MedPlanning 截骨模拟矫形功能
c++·图像处理·人工智能·qt·健康医疗
qq_4069810311 小时前
共享变量一 关于extern与const
开发语言·c++
chari克里13 小时前
QT5.15.2 + msvc2022部署全流程说明(windows可联网环境)
开发语言·c++·qt