diff --git a/Library/Library.md b/Library/Library.md new file mode 100644 index 0000000..16ae3eb --- /dev/null +++ b/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) + + + diff --git a/Library/pictures/图片1.png b/Library/pictures/图片1.png new file mode 100644 index 0000000..fcfb694 Binary files /dev/null and b/Library/pictures/图片1.png differ diff --git a/Library/pictures/图片10.png b/Library/pictures/图片10.png new file mode 100644 index 0000000..0dd31f1 Binary files /dev/null and b/Library/pictures/图片10.png differ diff --git a/Library/pictures/图片11.png b/Library/pictures/图片11.png new file mode 100644 index 0000000..1ea3a4d Binary files /dev/null and b/Library/pictures/图片11.png differ diff --git a/Library/pictures/图片12.png b/Library/pictures/图片12.png new file mode 100644 index 0000000..2db48d6 Binary files /dev/null and b/Library/pictures/图片12.png differ diff --git a/Library/pictures/图片13.png b/Library/pictures/图片13.png new file mode 100644 index 0000000..b323b02 Binary files /dev/null and b/Library/pictures/图片13.png differ diff --git a/Library/pictures/图片2.png b/Library/pictures/图片2.png new file mode 100644 index 0000000..153f725 Binary files /dev/null and b/Library/pictures/图片2.png differ diff --git a/Library/pictures/图片3.png b/Library/pictures/图片3.png new file mode 100644 index 0000000..b2e1705 Binary files /dev/null and b/Library/pictures/图片3.png differ diff --git a/Library/pictures/图片4.png b/Library/pictures/图片4.png new file mode 100644 index 0000000..79ac743 Binary files /dev/null and b/Library/pictures/图片4.png differ diff --git a/Library/pictures/图片5.png b/Library/pictures/图片5.png new file mode 100644 index 0000000..7dd966b Binary files /dev/null and b/Library/pictures/图片5.png differ diff --git a/Library/pictures/图片6.png b/Library/pictures/图片6.png new file mode 100644 index 0000000..759d068 Binary files /dev/null and b/Library/pictures/图片6.png differ diff --git a/Library/pictures/图片7.png b/Library/pictures/图片7.png new file mode 100644 index 0000000..9bcc3d1 Binary files /dev/null and b/Library/pictures/图片7.png differ diff --git a/Library/pictures/图片8.png b/Library/pictures/图片8.png new file mode 100644 index 0000000..0b007a8 Binary files /dev/null and b/Library/pictures/图片8.png differ diff --git a/Library/pictures/图片9.png b/Library/pictures/图片9.png new file mode 100644 index 0000000..100b475 Binary files /dev/null and b/Library/pictures/图片9.png differ