Procházet zdrojové kódy

修改Library基本概念

master
wsk před 6 dny
rodič
revize
376b31b55c
1 změnil soubory, kde provedl 108 přidání a 87 odebrání
  1. +108
    -87
      Library/Library.md

+ 108
- 87
Library/Library.md Zobrazit soubor

@@ -1,91 +1,112 @@
# 库相关知识点 # 库相关知识点

## 静态库 ## 静态库
- 静态库的基本概念

静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得
所需的代码 ,复制到生成的可执行文件中的这种库。

- 静态库的生成

![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")`指令

### 静态库的基本概念

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

#### 静态库的优点

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

#### 静态库的缺点

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

#### 静态库的生成

![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`下面,使用以下程序指令动态加载
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;
#### 动态库的基本概念

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

#### 动态库的优点

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

#### 动态库的缺点

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

#### 动态库的生成

- 通过导出语句生成

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`下面,使用以下程序指令动态加载

```
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;
```

Načítá se…
Zrušit
Uložit