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 "$(ProjectDir)3rd\mathTool.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 参考文章

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值