IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> C++知识点 生成与使用dll -> 正文阅读

[开发工具]C++知识点 生成与使用dll

1. Dll的导出

1.创建空项目
创建空项目
2.项目》属性》常规》配置类型 选择 动态库.dll
设置配置类型
3.写代码
头文件
mathTool.h

#pragma once

#ifdef MATH_API
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif

//函数描述:对两个int变量进行求和。
//返回值:求和后的int值
DLL_API int add(int a, int b);

__declspec(dllexport)的作用是将函数接口导出到DLL的导出列表里面。导出到dll的导出列表以后,别的项目才能根据函数名去dll中找到这个函数的位置。

头文件中加了一个宏定义MATH_API,其作用见步骤4。

具体实现
mathTool.cpp

int add(int a, int b)
{
	return a + b;
}

4…项目》属性》C/C++》预处理器》预处理器定义 添加宏定义MATH_API
设置宏定义
这里为什么要加宏定义MATH_API呢?

首先,dll的导出和导入的关键字区分在于__declspec()的括号里面是dllexport(导出)还是dllimport(导入)。在本项目中我需要告诉VS这个函数是导出的,在其他项目中需要告诉VS这个函数是从别的dll里面导入的。但是不管哪个项目,使用的都是math.h这个头文件,这时宏定义作为编译开关的作用就体现出来了。
在Demo1的项目生成中,由于我们定义了MATH_API的宏定义,所以DLL_API是被定义为__declspec(dllexport)。在其他项目中引用头文件math.h时,其他项目中并没有定义MATH_API的宏定义,所以DLL_API被定义为__declspec(dllimport)。这样就做到了同一份header不同的声明。

5.添加def文件
添加def文件
6.def文件书写
def文件的作用:

指定导出函数,并告知编译器不要以修饰后的函数名作为导出函数名,而以指定的函数名导出函数(比如有函数func,让编译器处理后函数名仍为func)。这样,就可以避免不同编译器对函数名不同的处理方式而引起的链接错误。

def文件格式如下:
LIBRARY XX(dll名称这个并不是必须的,但必须确保跟生成的dll名称一样)
EXPORTS
[函数名] @ [函数序号]

export.def

LIBRARY
EXPORTS
	add @ 1

同时我这里把目标文件名改成了mathTool,之前是$(ProjectName)
更改目标文件名
以上步骤完成后,点击生成,即可得到mathTool.dll和mathTool.lib。
注意:如果没有添加.def文件,将只会生成mathTool.dll文件,不会生成mathTool.lib文件。

2. Dll的引用

1.分别创建3个文件夹3rd、include、lib
并将mathTool.dll、mathTool.h、mathTool.lib分别拷贝到这3个文件夹中。
Dll的引用
2.项目》属性》C/C++》附加包含目录 添加刚创建的include文件夹
添加附加包含目录
2.项目》属性》链接器》常规》附加包含目录 添加刚创建的lib文件夹
添加lib文件夹
3.项目》属性》链接器》输入》附加依赖项 添加mathTool.lib
添加mathjTool.lib
4.项目》属性》生成事件》生成后事件》命令行
添加
xcopy “KaTeX parse error: Undefined control sequence: \mathTool at position 16: (ProjectDir)3rd\?m?a?t?h?T?o?o?l?.dll" "(SolutionDir)$(Platform)$(Configuration)” /y
生成后事件
至此,即可使用dll中的函数。
main.cpp

#include <cstdio>
#include "mathTool.h"

int main(int argc, char* argv[])
{
	const int result = add(10, 90);
	printf("计算后的结果为:%d", result);
	return 1;
}

总结:
1.项目》属性》C/C++》附加包含目录 添加include 是为了方便代码中查找头文件 ,可以直接#include "mathTool.h"而不用#include “include/mathTool.h”
2.项目》属性》链接器》常规》附加包含目录 添加刚创建的lib文件夹 是为了链接器链接时去搜索我们创建的lib文件夹
3.项目》属性》链接器》输入》附加依赖项 添加mathTool.lib 2中只是定义了搜索lib文件夹,但具体哪个文件在附件依赖项来定义
4.项目》属性》生成事件》生成后事件》命令行 是为了自动拷贝mathTool.dll到程序生成目录,而不用人为收到拷贝
5.头文件、lib文件、dll文件说明
?.h头文件,包含dll中说明输出的类或符号原型或数据结构的.h文件。应用程序调用dll时,需要将该文件包含入应用程序的源文件中。
?.LIB文件,是dll在编译、链接成功之后生成的文件,作用是当其他应用程序调用dll时,需要将该文件引入应用程序,否则产生错误(如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载)。
?dll文件,真正的可执行文件,开发成功后的应用程序在发布时,只需要有.exe文件和.dll文件,并不需要.lib文件和.h头文件。

3 参考文章

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-10-09 16:28:46  更:2021-10-09 16:30:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 0:48:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码