链接和库整理

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

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

技术细节对比

特性 静态链接/静态库 动态链接/动态库
文件大小 较大 较小
内存使用 每个程序独立占用 多个程序可共享
部署复杂度 简单(单文件) 复杂(需附带库文件)
更新方式 需重新编译 可单独更新库
加载时机 编译时 运行时
执行速度 略快(无加载开销) 略慢(有加载开销)
版本兼容性 无问题 可能有问题
适用场景 小型工具、嵌入式系统 大型应用、系统组件
相关推荐
卷无止境1 天前
C++ 的Eigen 库全解析
c++
卷无止境1 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴1 天前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake
博客18003 天前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝
郝学胜_神的一滴3 天前
CMake 026:属性体系精讲、四大作用域全解 & 实战代码落地
c++·cmake
众少成多积小致巨4 天前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
clint4568 天前
C++进阶(1)——前景提要
c++
夜悊8 天前
C++代码示例:进制数简单生成工具
c++
郝学胜_神的一滴8 天前
CMake 021: IF 条件判据详诠
c++·cmake
_wyt0019 天前
洛谷 B3930 [GESP202312 五级] 烹饪问题 题解
c++·gesp