# 库相关知识点

## 静态库

### 静态库的基本概念

静态库是指在我们的应用中，有一些公共代码是需要反复使用，就把这些代码编译为“库”文件;在链接步骤中，连接器将从库文件取得
所需的代码 ，复制到生成的可执行文件中的这种库。在程序编译时会被整合到最终的可执行文件中，这意味着编译后的程序可以独立运行，无需外部库。

#### 静态库的优点

加载速度快，因为库的代码已经被包含在程序中，以及发布程序时无需提供静态库文件，便于移植。

#### 静态库的缺点

相同的库文件可能在内存中被加载多次，消耗系统资源；此外，每当库文件更新时，都需要重新编译整个项目以生成新的可执行文件，这会浪费时间。

#### 静态库的生成

![image-20250710102658220](./pictures/image-20250710102658220.png)

![image-20250710102736776](./pictures/image-20250710102736776.png)

#### 静态库的调用

- 在工程配置中调用

  1. 头文件的引用

  方案一：设置头文件目录

  将头文件复制到我们的工程文件中。

  方案二：

  ![image-20250710103535872](./pictures/image-20250710103535872.png)

  2. 库文件的引用

     方案一：连接器设置库文件目录![image-20250710103348996](./pictures/image-20250710103348996.png)

     方案二：

     ![image-20250710105104029](./pictures/image-20250710105104029.png)

     将lib添加到资源文件中

- 在代码中语句加载lib调用

  使用`#pragma comment(lib, "creat_static_lib.lib")`指令
  
  

## 动态库
#### 动态库的基本概念

动态库是一种在程序运行时才被加载的库文件，它包含了函数和数据，可以被多个程序共享。

#### 动态库的优点

可以实现不同进程间的资源共享，升级简单，只需替换库文件而无需重新编译应用程序，以及可以控制库的加载时机，不调用库函数时库不会被加载。

#### 动态库的缺点

其加载速度比静态库慢，且发布程序时需要提供依赖的动态库文件。

#### 动态库的生成

- 通过导出语句生成

1. 先宏定义MATHLIBRARY_EXPORTS

2. 写导出语句

![image-20250710133121032](./pictures/image-20250710133121032.png)

3. .C文件正常编写需要封装函数的逻辑

- 通过模块文件生成

  ![image-20250710133513492](./pictures/image-20250710133513492.png)

  ![image-20250710133559788](./pictures/image-20250710133559788.png)

  ![image-20250710133741106](./pictures/image-20250710133741106.png)

#### 动态库的调用

在工程配置中调用

导入头文件，引用

![image-20250710133846878](./pictures/image-20250710133846878.png)

~~在代码中语句加载lib调用~~

`#pragma comment(lib, "creat_static_lib.lib")`

在代码中语句加载`dll`调用

将`dll`文件复制到`dbug`下面，使用以下程序指令动态加载

```
#include <Windows.h>
HINSTANCE Dll = LoadLibrary(L"test.dll");
if (Dll == NULL) {
    std::cerr << "无法加载DLL! 错误码: " << GetLastError() << std::endl;
    return 1;
}
typedef void (*Func)(); // 定义函数指针类型
Func add = (Func)GetProcAddress(Dll, "fun1");
add();
FreeLibrary(Dll);
return 0;
```



![image-20250715145914567](./pictures/image-20250715145914567.png)





![image-20250715145953621](./pictures/image-20250715145953621.png)

![image-20250715145825247](./pictures/image-20250715145825247.png)