20220523,模板

This commit is contained in:
2022-05-23 10:06:16 +08:00
parent 167ff10608
commit 52383fc49b
117 changed files with 127 additions and 29935 deletions
+34 -31
View File
@@ -25,7 +25,7 @@ password:
## DLL概述
概述内容[来自博客](https://blog.csdn.net/elaine_bao/article/details/51784864?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_default&utm_relevant_index=12)
本节内容[来自博客](https://blog.csdn.net/elaine_bao/article/details/51784864?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_default&utm_relevant_index=12)
它们是一些独立的文件,其中包含能被可执行程序或其他dll调用来完成某项工作的函数,只有在其他模块调用dll中的函数时,dll才发挥作用。
@@ -63,13 +63,13 @@ password:
C++库-类型选择shared
![image-20220415075952640](https://gitee.com/tianzhendong/img/raw/master/images/202204280931661.png)
![image-20220415075952640](./assets/dll生成与使用/202204280931661.png)
#### 新建文件
右键项目,新建C/C++源文件(或者直接新建一个类),并勾选创建关联头
![image-20220415080306293](https://gitee.com/tianzhendong/img/raw/master/images/202204161800789.png)
![image-20220415080306293](./assets/dll生成与使用/202204161800789.png)
#### 编写c++
@@ -140,7 +140,7 @@ int Student::getAge() {
在debug目录下生成了.dll、.lib文件,后续主要用到.dll、.lib和.h文件
![image-20220415081755593](https://gitee.com/tianzhendong/img/raw/master/images/202204161800737.png)
![image-20220415081755593](./assets/dll生成与使用/202204161800737.png)
### 测试
@@ -170,13 +170,13 @@ dumpbin -exports Dll1.dll
#### 新建项目
![image-20220415082005386](https://gitee.com/tianzhendong/img/raw/master/images/202204161800823.png)
![image-20220415082005386](./assets/dll生成与使用/202204161800823.png)
#### 在项目根目录新建lib文件夹
将上述生成的.dll .lib 和编写的.h文件复制到lib中
![image-20220415104232406](https://gitee.com/tianzhendong/img/raw/master/images/202204161800779.png)
![image-20220415104232406](./assets/dll生成与使用/202204161800779.png)
#### cmakelist.txt添加:
@@ -203,7 +203,7 @@ target_link_libraries(${PROJECT_NAME}
#### 运行/调试配置:
![image-20220415082456066](https://gitee.com/tianzhendong/img/raw/master/images/202204161801274.png)
![image-20220415082456066](./assets/dll生成与使用/202204161801274.png)
#### 调用
@@ -443,7 +443,7 @@ int main() {
}
```
![image-20220415131004040](https://gitee.com/tianzhendong/img/raw/master/images/202204161801691.png)
![image-20220415131004040](./assets/dll生成与使用/202204161801691.png)
@@ -516,11 +516,11 @@ int main() {
选择`具有导出项的DLL动态链接库`
![image-20220415205304326](https://gitee.com/tianzhendong/img/raw/master/images/202204161801655.png)
![image-20220415205304326](./assets/dll生成与使用/202204161801655.png)
![image-20220415205923849](https://gitee.com/tianzhendong/img/raw/master/images/202204161801582.png)
![image-20220415205923849](./assets/dll生成与使用/202204161801582.png)
@@ -566,7 +566,7 @@ void hello2() {
在项目中定义.def 文件,该文件为模块导出文件
![image-20220415210130710](https://gitee.com/tianzhendong/img/raw/master/images/202204161801369.png)
![image-20220415210130710](./assets/dll生成与使用/202204161801369.png)
编写.def
@@ -578,11 +578,11 @@ EXPORTS
如果是vs平台,需要在连接器中添加.def文件,如果是通过上述方式添加的.def,会自动添加
![image-20220415210911123](https://gitee.com/tianzhendong/img/raw/master/images/202204161801001.png)
![image-20220415210911123](./assets/dll生成与使用/202204161801001.png)
然后点击 “ 生成解决方案 ” ,就可以在工程目录的 debug 目录或者 release 目录下(这取决你生成的是debug版本还是release版本)生成了动态链接库的相关文件。第三方调用时关键的文件为 **.lib文件** 和 **.dll文件** 以及工程目录下的 **.h头文件**
![image-20220415211216385](https://gitee.com/tianzhendong/img/raw/master/images/202204161801637.png)
![image-20220415211216385](./assets/dll生成与使用/202204161801637.png)
### 调用
@@ -614,14 +614,14 @@ int main()
}
```
![image-20220415211932141](https://gitee.com/tianzhendong/img/raw/master/images/202204161801293.png)
![image-20220415211932141](./assets/dll生成与使用/202204161801293.png)
##### 在解决方案管理面板中添加头文件和资源文件
添加一个现有项头文件,在文件夹中找到第三方库的头文件( .h ),添加进新建立的项目。
添加一个现有项资源文件,在文件夹中找到第三方库的库文件( .lib ),添加进新建立的项目。
![image-20220415212042047](https://gitee.com/tianzhendong/img/raw/master/images/202204161801281.png)
![image-20220415212042047](./assets/dll生成与使用/202204161801281.png)
```c
#include <iostream>
@@ -655,13 +655,13 @@ int main()
VS2019 自带的工具 dumpbin.exe 可以查看编译后的 动态链接库对应的 函数名。
![image-20220415212305795](https://gitee.com/tianzhendong/img/raw/master/images/202204161801247.png)
![image-20220415212305795](./assets/dll生成与使用/202204161801247.png)
打开命令行,输入命令 `dumpbin -exports Dll2.dll`
这里采用博客中的内容:
![img](https://gitee.com/tianzhendong/img/raw/master/images/202204161801007.png)
![img](./assets/dll生成与使用/202204161801007.png)
所以 addFunc 不能直接使用,只能用被 name Mangling 后的名字 ,这里 **addFunc** 编译后的名字是 **?addFunc@@YAHHH@Z**
@@ -709,12 +709,13 @@ int main()
FreeLibrary(hModule);
}
```
##### 使用lib和dll文件
***CPPDLL.dll** 文件放到 debug 目录下,
* 然后在项目中引入 **CPPDLL.lib** 文件。 **链接器** -> **输入** -> **附加依赖项** -> **编辑**
![img](https://gitee.com/tianzhendong/img/raw/master/images/202204161802483.png)
![img](./assets/dll生成与使用/202204161802483.png)
```c
#include <iostream>
@@ -750,6 +751,8 @@ int main()
这样就不用 手动设置 添加 lib 文件了
#### 多层调用
只需要把多层的dll都放进去即可
@@ -878,11 +881,11 @@ void Student2::student2Hello() {
### 建立netframework项目
![image-20220415183057359](https://gitee.com/tianzhendong/img/raw/master/images/202204161802422.png)
![image-20220415183057359](./assets/dll生成与使用/202204161802422.png)
### 将两个dll文件放到debug目录下
![image-20220415183130534](https://gitee.com/tianzhendong/img/raw/master/images/202204161802830.png)
![image-20220415183130534](./assets/dll生成与使用/202204161802830.png)
### 调用
@@ -929,15 +932,15 @@ namespace ConsoleApp3
- 新建dll项目
![image-20220416163601291](https://gitee.com/tianzhendong/img/raw/master/images/202204161802876.png)
![image-20220416163601291](./assets/dll生成与使用/202204161802876.png)
![image-20220416163629764](https://gitee.com/tianzhendong/img/raw/master/images/202204161802629.png)
![image-20220416163629764](./assets/dll生成与使用/202204161802629.png)
![image-20220416163646551](https://gitee.com/tianzhendong/img/raw/master/images/202204161802040.png)
![image-20220416163646551](./assets/dll生成与使用/202204161802040.png)
生成后的结构如下(这里用的的DllDemo1):
![image-20220416171503348](https://gitee.com/tianzhendong/img/raw/master/images/202204161802235.png)
![image-20220416171503348](./assets/dll生成与使用/202204161802235.png)
其中_global.h自带两个系统默认导出宏
@@ -1009,27 +1012,27 @@ int myadd(int a, int b){
#### 新建c++控制台项目
![image-20220416172129620](https://gitee.com/tianzhendong/img/raw/master/images/202204161802293.png)
![image-20220416172129620](./assets/dll生成与使用/202204161802293.png)
#### 构建项目,生成debug目录
#### 将dll文件放到debug目录
![image-20220416172227912](https://gitee.com/tianzhendong/img/raw/master/images/202204161802638.png)
![image-20220416172227912](./assets/dll生成与使用/202204161802638.png)
#### 将lib文件放到工程目录下
![image-20220416172258532](https://gitee.com/tianzhendong/img/raw/master/images/202204161802366.png)
![image-20220416172258532](./assets/dll生成与使用/202204161802366.png)
#### 右键项目,添加lib库
![](https://gitee.com/tianzhendong/img/raw/master/images/202204161802541.png)
![](./assets/dll生成与使用/202204161802541.png)
**选择外部库**
选择刚才的lib文件,取消平台下的linux,mac,取消为debug版本添加d作为哦后缀,点击完成代码就被添加进call.pro
![image-20220416172524995](https://gitee.com/tianzhendong/img/raw/master/images/202204161808242.png)
![image-20220416172524995](./assets/dll生成与使用/202204161808242.png)
#### 调用
@@ -1061,7 +1064,7 @@ int main(int argc, char *argv[])
右键项目,添加两个.h文件
![image-20220416175017723](https://gitee.com/tianzhendong/img/raw/master/images/202204161802804.png)
![image-20220416175017723](./assets/dll生成与使用/202204161802804.png)
引入头文件
@@ -1085,4 +1088,4 @@ int main(int argc, char *argv[])
return a.exec();
}
```
```