生成动态链接库和静态链接库以及可执行文件的区别

在 C++ 编程中,生成动态链接库(Dynamic Link Library,DLL,在 Linux 下一般称为共享库,文件扩展名为 .so;在 Windows 下扩展名为 .dll)、静态链接库(Static Link Library,文件扩展名为 .a.lib)以及可执行文件存在多方面的区别,下面从多个维度进行详细介绍:

1. 文件生成方式

静态链接库

静态链接库是由多个目标文件(.o.obj)打包而成的。使用 ar 工具(在 Linux 系统)将目标文件归档为一个静态库文件。
示例命令

# 编译源文件生成目标文件
g++ -c file1.cpp -o file1.o
g++ -c file2.cpp -o file2.o
# 创建静态链接库
ar rcs libexample.a file1.o file2.o

动态链接库

动态链接库同样需要先将源文件编译成目标文件,不过在链接时要使用特殊的编译选项(如 -shared)来生成共享库。
示例命令

# 编译源文件生成目标文件,开启位置无关代码
g++ -fPIC -c file1.cpp -o file1.o
g++ -fPIC -c file2.cpp -o file2.o
# 创建动态链接库
g++ -shared -o libexample.so file1.o file2.o

可执行文件

可执行文件是将目标文件与所需的库(静态库或动态库)进行链接生成的。链接静态库时,库的代码会被完整地复制到可执行文件中;而链接动态库时,可执行文件仅记录库的引用信息。
示例命令

# 链接静态库生成可执行文件
g++ main.cpp -L. -lexample -o main_static
# 链接动态库生成可执行文件
g++ main.cpp -L. -lexample -o main_dynamic

2. 链接方式

静态链接库

在编译时,静态链接库的代码会被完整地复制到可执行文件中。这意味着一旦链接完成,可执行文件就不再依赖于该静态库文件,即使静态库文件被删除,可执行文件依然可以正常运行。

动态链接库

动态链接库在编译时不会将库代码复制到可执行文件中,可执行文件仅包含对动态库的引用信息。在程序运行时,操作系统会将动态库加载到内存中,并将可执行文件与动态库进行链接。

3. 文件大小

静态链接库

由于静态链接会把库代码复制到可执行文件中,所以生成的可执行文件通常较大。如果多个程序都使用同一个静态库,每个程序都会包含一份完整的库代码,造成磁盘空间的浪费。

动态链接库

动态链接的可执行文件只包含对动态库的引用,不包含库的实际代码,因此文件大小相对较小。多个程序可以共享同一个动态库,减少了磁盘空间的占用。

4. 运行时依赖

静态链接库

使用静态链接库生成的可执行文件不依赖于外部的静态库文件,具有较好的独立性,方便在不同环境中部署。

动态链接库

使用动态链接库生成的可执行文件在运行时依赖于相应的动态库文件。如果动态库文件缺失、版本不兼容或者路径配置不正确,程序可能无法正常运行。

5. 更新和维护

静态链接库

如果静态库有更新,需要重新编译所有使用该库的可执行文件,因为库代码已经被复制到可执行文件中。

动态链接库

动态库的更新相对方便,只需替换动态库文件,无需重新编译使用该库的可执行文件。新的动态库会在程序下次运行时被加载使用。

6. 性能

静态链接库

静态链接的程序在运行时不需要进行额外的库加载操作,启动速度可能会快一些,因为所有代码都已经包含在可执行文件中。

动态链接库

动态链接的程序在运行时需要进行库的加载和链接操作,启动速度可能会稍慢。不过,由于多个程序可以共享同一个动态库,节省了内存资源,在多程序同时运行的情况下,整体性能可能更优。

posted @   O-ll-O  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示