diff --git a/Library/Library.md b/Library/Library.md index 1c9fad9..2b3300d 100644 --- a/Library/Library.md +++ b/Library/Library.md @@ -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; \ No newline at end of file +#### 动态库的基本概念 + +动态库是一种在程序运行时才被加载的库文件,它包含了函数和数据,可以被多个程序共享。 + +#### 动态库的优点 + +可以实现不同进程间的资源共享,升级简单,只需替换库文件而无需重新编译应用程序,以及可以控制库的加载时机,不调用库函数时库不会被加载。 + +#### 动态库的缺点 + +其加载速度比静态库慢,且发布程序时需要提供依赖的动态库文件。 + +#### 动态库的生成 + +- 通过导出语句生成 + +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; +``` \ No newline at end of file