wangxinyu преди 1 седмица
родител
ревизия
95f5df9779
променени са 14 файла, в които са добавени 208 реда и са изтрити 0 реда
  1. +208
    -0
      Library/Library.md
  2. Двоични данни
      Library/pictures/图片1.png
  3. Двоични данни
      Library/pictures/图片10.png
  4. Двоични данни
      Library/pictures/图片11.png
  5. Двоични данни
      Library/pictures/图片12.png
  6. Двоични данни
      Library/pictures/图片13.png
  7. Двоични данни
      Library/pictures/图片2.png
  8. Двоични данни
      Library/pictures/图片3.png
  9. Двоични данни
      Library/pictures/图片4.png
  10. Двоични данни
      Library/pictures/图片5.png
  11. Двоични данни
      Library/pictures/图片6.png
  12. Двоични данни
      Library/pictures/图片7.png
  13. Двоични данни
      Library/pictures/图片8.png
  14. Двоични данни
      Library/pictures/图片9.png

+ 208
- 0
Library/Library.md Целия файл

@@ -0,0 +1,208 @@
# 库相关知识点
## 静态库

### 1.1基本概念

> 后缀(.lib .a),是一个包含编译好的目标文件(.obj/.o 文件)的归档文件包。
>
> **编译时链接**: 关键特征在于它是在程序编译和链接阶段被处理的
>
> 程序(.exe/另一个库)链接静态库时,----->扫描静态库找`.obj/.o` 文件----->提取合并到最终程序或目标库

* 直接包含头文件,链接文件

* 不需要复杂的加载或依赖

### 1.2静态库生成

1. 新建项目--选择静态库--创建项目

![](pictures\图片5.png)

2. 创建.c和.h文件

3. 点击生成解决方案

4. 生成文件

![](pictures\图片6.png)

### 1.3静态库的调用

1. 新建项目---选择控制台应用---配置创建

2. 右键项目--添加--添加引用

![](pictures\图片8.png)

3. 引用.h文件--所有配置--所有平台--配置c/c++常规----附加包含添加目录

![](pictures\图片9.png)

4. 就可以使用引入的库了

![](pictures\图片10.png)

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

#### 链接使用静态库(都可以在附加目录中添加路径)

1. 需要将.lib链接到主程序

`#pragma comment(lib,"lib/StaticLib1.lib")`

2. 添加.h文件

~~~ cpp
#pragma comment(lib,"lib/StaticLib1.lib")
#include "externalUse.h" //必须包含头文件
~~~


**项目依赖**作用是确保在构建主项目时先构建依赖项目(控制编译顺序),

**项目引用**主项目不仅知道依赖,还会自动链接 `.lib` 文件(控制链接阶段)


## 动态库

### 2.1 概念

> DLL 是一种**共享库机制**(Dynamic Link Library),本质上是包含**可执行代码和数据**的二进制文件(`.dll` 后缀)。不同于程序主文件(EXE),它本身不能独立运行(`DllMain` 是初始化的入口点),必须由 EXE 或 其他 DLL 在**运行时动态加载和调用**。

* 作用代码复用减少冗余
* 模块开发,节省内存,资源封装共享,拓展内容

### 2.2 生成

1. 新建项目-->选择动态链接库——>项目配置创建

![](pictures\图片4.png)

2. 添加头文件和源文件 --->添加预处理定义设置

~~~ cpp
#pragma once
#define DLL_API
#ifdef DLL_API
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif // DLL_API
class DLL_API externalUse
{
public:
externalUse();
~externalUse();
int add(int a, int b);
int subract(int a, int b);
int multiply(int a, int b);
int divide(int a, int b);
};
~~~
~~~ cpp
#pragma once
#include "pch.h"
#include "externalUse.h"
externalUse::externalUse(){
}
externalUse::~externalUse() {
}
int externalUse::add(int a, int b){
return a + b;
}
int externalUse::subract(int a, int b){
return a - b;
}
int externalUse::multiply(int a, int b){
return a * b;
}
int externalUse::divide(int a, int b){
return a / b;
}
~~~
3. 创建类,导出类成员

4. 配置导出路径(项目--属性--路径)

5. 点击项目--生成解决方案

![](pictures\图片2.png)

6. 生成动态库得到如下文件

![](pictures\图片3.png)



### 2.3调用

#### 2.3.1 使用DLL链接导入

* 隐式链接

~~~
#include包含声明导出函数头文件
项目设置(Linker - Input - Additional Dependencies)中添加 .lib​(导入库)​。
便于使用
~~~

* 显性链接

按需加载

> 静态库(.lib)与动态库(.dll/.so)区别:
>
> - **静态库**:编译/链接时,库代码被**直接复制并合并**到最终 EXE 文件中。
> - **动态库**:编译/链接时只记录**引用信息**(函数名、位置);代码在**运行时**由操作系统加载器动态加载。
>
> **导入库(.lib - 用于隐式链接):** 一个**小的辅助库**,包含:1)告诉链接器该 DLL 存在哪些导出符号;2)包含少量跳转到 DLL 实际函数的存根代码。**不包含 DLL 的实际功能代码。**
>
> **头文件(.h):** 包含函数声明、类定义、宏、常量等,告诉调用者如何使用 DLL 的接口。

#### 2.3.2 加载lib调用

同静态库一样

#### 2.3.3 加载dll调用



1. **头文件引用**:包含`.h`(复制到调用方项目)可将.h放到lib中

![](pictures\图片11.png)

2. 库文件配置

- 链接`.lib`(项目属性 → 链接器 → 输入 → 附加依赖项)

![](pictures\图片12.png)

* 添加库目录(链接器 → 常规 → 附加库目录)

![](pictures\图片13.png)

| 项目 | 功能 |
| ---------- | --------------------- |
| C/C++ | 附加目录配置.c .h路径 |
| 链接器输入 | 添加.dll所在路径 |
| 链接器常规 | 附加路径添加.lib |







[动态库添加](https://learn.microsoft.com/zh-cn/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view=msvc-170)

[动态库生成](https://cloud.tencent.com/developer/article/2532337)




Двоични данни
Library/pictures/图片1.png Целия файл

Преди След
Ширина: 586  |  Височина: 287  |  Големина: 30 KiB

Двоични данни
Library/pictures/图片10.png Целия файл

Преди След
Ширина: 1035  |  Височина: 636  |  Големина: 104 KiB

Двоични данни
Library/pictures/图片11.png Целия файл

Преди След
Ширина: 973  |  Височина: 292  |  Големина: 38 KiB

Двоични данни
Library/pictures/图片12.png Целия файл

Преди След
Ширина: 1023  |  Височина: 520  |  Големина: 75 KiB

Двоични данни
Library/pictures/图片13.png Целия файл

Преди След
Ширина: 1051  |  Височина: 613  |  Големина: 92 KiB

Двоични данни
Library/pictures/图片2.png Целия файл

Преди След
Ширина: 742  |  Височина: 835  |  Големина: 86 KiB

Двоични данни
Library/pictures/图片3.png Целия файл

Преди След
Ширина: 856  |  Височина: 392  |  Големина: 38 KiB

Двоични данни
Library/pictures/图片4.png Целия файл

Преди След
Ширина: 1266  |  Височина: 838  |  Големина: 82 KiB

Двоични данни
Library/pictures/图片5.png Целия файл

Преди След
Ширина: 1245  |  Височина: 832  |  Големина: 76 KiB

Двоични данни
Library/pictures/图片6.png Целия файл

Преди След
Ширина: 457  |  Височина: 165  |  Големина: 9.0 KiB

Двоични данни
Library/pictures/图片7.png Целия файл

Преди След
Ширина: 1270  |  Височина: 841  |  Големина: 89 KiB

Двоични данни
Library/pictures/图片8.png Целия файл

Преди След
Ширина: 977  |  Височина: 740  |  Големина: 152 KiB

Двоични данни
Library/pictures/图片9.png Целия файл

Преди След
Ширина: 1008  |  Височина: 288  |  Големина: 36 KiB

Зареждане…
Отказ
Запис