# 库相关知识点 ## 静态库 ### 静态库的基本概念 静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得 所需的代码 ,复制到生成的可执行文件中的这种库。在程序编译时会被整合到最终的可执行文件中,这意味着编译后的程序可以独立运行,无需外部库。 #### 静态库的优点 加载速度快,因为库的代码已经被包含在程序中,以及发布程序时无需提供静态库文件,便于移植。 #### 静态库的缺点 相同的库文件可能在内存中被加载多次,消耗系统资源;此外,每当库文件更新时,都需要重新编译整个项目以生成新的可执行文件,这会浪费时间。 #### 静态库的生成 ![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 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)