---
title: "静态链接库和动态链接库的区别"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/static-vs-dynamic-library/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/02-编程语言与运行时/C++/静态链接库和动态链接库的区别.md"
content_hash: bd2d68a167b10e68cd031b24654c204eff9d032072f62a88a7bab4a8bd95179a
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# 静态链接库和动态链接库的区别

﻿# 静态链接库和动态链接库的区别

> 创建时间：2020/3/6 13:40

### 静态链接库和动态链接库的区别

参考：https://blog.csdn.net/wqfhenanxc/article/details/80496522

#### 两者区别

所谓 **静态链接库（Static Link Library）** ，是在编译的链接阶段将库函数嵌入到应用程序的内部。但是如果多次调用，则该库函数会被调用多次，会极大的造成空间浪费以及链接器的负担（缺点）。它的优势在于，应用程序可以独立运行，因为在静态链接的时候已经将所需的组件都已经加载到了该应用程序中，不需要对应的DLL，但是应用程序比较大。
所谓 **动态链接库（Dynamic link library）** ，与静态链接方式不同的是，它会将公用的库函数以及相关组件信息存放在一个地方，只是将地址信息告诉了链接器，只有在应用程序调用了该动态库之后才会加载到内存。其缺点是应用程序不能独立运行，需要在操作系统中安装对应的DLL以及运行环境。优点是生成的可执行文件很小。
————————————————
版权声明：本文为CSDN博主「执笔乄画浮生」的原创文章，遵循 CC 4.0 BY-SA 版权协议，转载请附上原文出处链接及本声明。
原文链接：https://blog.csdn.net/Alan_Program/article/details/93172050

_具体的实现代码，参考以上链接_

#### 动态链接

**动态链接库dynamic link library：** LIB包含了函数所在的DLL文件和文件中函数位置的信息（入口），代码由运行时加载在进程空间中的DLL提供
**动态链接** 使用动态链接库，允许可执行模块（.dll文件或.exe文件）仅包含在运行时定位DLL中函数的可执行代码所需的信息。

##### 使用：

一、动态库的隐示调用：

  * 需要的文件： 头文件 .h 、动态链接库的.lib文件，动态链接库的dll文件
  * 头文件.h和静态链接库使用时的作用一样，使用动态链接库中的函数的项目需要引用该文件才能编译通过
  * .lib包含了函数所在的DLL文件和文件中函数位置的信息，.dll包含了实际执行代码、符号表等等
  * 加载lib的方法：lib是编译链接是用的，跟使用静态链接库时一样有两种方法：法1.使用编译链接参数或者VS的配置属性来设置 法2.使用pragma编译语句，例如pragma comment(lib,"a.lib")
  * 加载dll的方法：dll是运行时用的，链接了lib之后形成的EXE可执行文件中已经有了dll的信息，所以只要把dll放在和exe同一个目录下就可以了，运行时根据EXE需要自动加载dll中的函数

二、动态库的显式调用：

  * 需要的文件： 动态链接库的dll文件
  * 不需要.h头文件和.lib文件，因为LoadLibrary之后可以使用getProcAddress来查找一个函数的地址从而调用该函数 (显式调用的前提是使用者需要知道想调用的函数的名字、参数、返回值信息，也就是说虽然编译链接用不上.h头文件，但是调用者编程时可能还是要看.h文件作参考来知道函数名字、参数、返回值信息)

**显式调用动态库步骤：**
1、创建一个函数指针，其指针数据类型要与调用的 DLL 引出函数相吻合。
2、通过 Win32 API 函数LoadLibrary（）显式的调用DLL，此函数返回DLL 的实例句柄。
3、通过 Win32 API 函数GetProcAddress（）获取要调用的DLL 的函数地址,把结果赋给自定义函数的指针类型。
4、使用函数指针来调用 DLL 函数。
5、最后调用完成后，通过 Win32 API 函数FreeLibrary()释放DLL 函数。

最后，特别说明下载使用 **C#显式调用dll** 时会更加简单，如下：

[DLLImport(“DLL文件”)]
修饰符 extern 返回变量类型 方法名称 （参数列表）
描述如下：
DLL文件：包含定义外部方法的库文件。
修饰符： 访问修饰符，除了abstract以外在声明方法时可以使用的修饰符。
返回变量类型：在DLL文件中你需调用方法的返回变量类型。
方法名称：在DLL文件中你需调用方法的名称。
参数列表：在DLL文件中你需调用方法的列表。

#### 静态链接

**静态链接库static link library：** LIB包含函数代码本身，在编译时直接将代码加入程序当中
**静态链接：** 使用静态链接库，链接器从静态链接库LIB获取所有被引用函数，并将库同代码一起放到可执行文件中。

##### 使用：

  * 需要的文件： 头文件 .h 、静态库 .lib
  * 头文件.h中有函数的声明，使用静态链接库的项目需要引用该文件才能编译通过
  * .lib包含了实际执行代码、符号表等等
  * 加载lib的方法： 法1.使用编译链接参数或者VS的配置属性来设置 法2.使用pragma编译语句，例如pragma comment(lib,"a.lib")
  * .lib中的指令将全部被直接包含在最终生成的 EXE 文件中
