链接和库整理

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

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

技术细节对比

特性 静态链接/静态库 动态链接/动态库
文件大小 较大 较小
内存使用 每个程序独立占用 多个程序可共享
部署复杂度 简单(单文件) 复杂(需附带库文件)
更新方式 需重新编译 可单独更新库
加载时机 编译时 运行时
执行速度 略快(无加载开销) 略慢(有加载开销)
版本兼容性 无问题 可能有问题
适用场景 小型工具、嵌入式系统 大型应用、系统组件
相关推荐
yyy(十一月限定版)2 小时前
016【入门】双端队列
数据结构·c++
c238562 小时前
# Mini OJ — 项目详解文档
开发语言·数据库·c++
c238563 小时前
C/C++每日一练20
c语言·开发语言·c++
可爱系程序猿3 小时前
msvcp140_codecvt_ids.dll 缺失的排查记录:C++ 程序启动异常时如何核对运行库版本
开发语言·c++·程序人生·电脑
encoconut3 小时前
01_C++ 入门基础
c++
郝学胜-神的一滴5 小时前
中级OpenGL教程 030:gl_FragCoord解锁区域渲染与深度可视化新姿势
c++·unity·游戏引擎·图形渲染·unreal engine·opengl
不会代码的小猴5 小时前
11. 类和动态内存分配
开发语言·c++
沫璃染墨6 小时前
《Qt从零入门系列(二):Qt开发环境搭建——从Qt Creator到SDK配置》
c++·ide·qt
鱼子星_6 小时前
【C++】stack和queue的应用及其模拟实现:适配器与容器适配器
数据结构·c++·笔记·stl
jufeng13076 小时前
【系列:MiniKV 原理剖析 · 第 2 篇】
linux·c++·软件工程