栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++知识点 生成与使用dll

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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文件

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个文件夹中。

2.项目》属性》C/C++》附加包含目录 添加刚创建的include文件夹

2.项目》属性》链接器》常规》附加包含目录 添加刚创建的lib文件夹

3.项目》属性》链接器》输入》附加依赖项 添加mathTool.lib

4.项目》属性》生成事件》生成后事件》命令行
添加
xcopy " $(ProjectDir)3rdmathTool.dll" “$(SolutionDir)$(Platform)$(Configuration)” /y

至此,即可使用dll中的函数。
main.cpp

#include 
#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 参考文章
  • VS2017的C++开发心得(八)DLL动态链接——Opencv的使用
  • VS2017的C++开发心得(九)DLL动态链接——多项目开发
  • VS2017创建DLL动态库------C#调用
  • 【编程笔记】extern “C”和.def文件和__stdcall和__cdcel的作用
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/302699.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号