一、简介
概要:
上一篇文章C++学习记录003——创建DLL(“__declspec(dllexport)“ 版本,无需自己写DEF 文件)介绍了通过“__declspec(dllexport)”关键字导出函数接口。本文将介绍如何创建DLL,不使用“__declspec(dllexport)”,而是自己写def文件的方式导出接口。
二、具体
(一)创建C++”动态链接库(DLL)“项目
创建C++”动态链接库(DLL)“项目,给项目取个名字,比如我的项目名是”ComplexMath“。
(二)接口函数的创建与导出
(1)添加.h文件
跟上一篇文章说的一样,这个文件主要用来申明我们将要导出的接口函数。
项目上右击——>“添加” ——>"新建项" ——>“头文件” ——>给头文件取个名字 ,比如我的是”ComplexMathAPI.h“——>"添加"。
(2)添加.cpp文件
这里主要用来 实现 前面头文件中申明的接口函数。
项目上右击——>“添加” ——>"新建项"——>“C++文件” ——>给文件取个名字 ,比如我的是”ComplexMathAPI.cpp“——>"添加"。
(3)添加.def文件
这个文件主要用来导出函数接口。有了这个文件,即使函数前面不用“__declspec(dllexport)”关键字修饰也可以导出函数。
项目上右击——>“添加”——>“新建项”——>“代码”——>“模块定义文件(.def)”——>名字我就不改了,默认是“Source.def”——>“添加”。
(4)“ComplexMathAPI.h"代码
//ComplexMathAPI.h
#pragma once
#ifndef _COMPLEXMATHAPI_H_
#define _COMPLEXMATHAPI_H_
#ifdef __cplusplus
extern "C"
{
int Multiple(int a,int b);
int Division(int a,int b);
}
#else
int Multiple(int a, int b);
int Division(int a, int b);
#endif
#endif
(5)”ComplexMathAPI.cpp“代码
//ComplexMathAPI.cpp
#include "pch.h"
#include "ComplexMathAPI.h"
int Multiple(int a, int b)
{
return a * b;
}
int Division(int a, int b)
{
return a / b;
}
到这一步,我们如果编译的话,是没有导出函数接口的,我们可以用Dependency工具,把DLL文件拖进去看,这时候可以看到是没有导出接口的。
(6)"Source.def"文件代码
LIBRARY
EXPORTS
Multiple
Division
加了def文件之后,编译,再次用Dependency工具,把Dll文件拖进去看一下。
接口已经成功导出。
三、编译
编译之后,在Debug 文件夹下(如果是Release 模式,则在Release文件夹下)会有“ComplexMath.dll”文件和“ComplexMath.lib”文件生成。这两个文件在后期调用DLL的过程中是关键。
四、调用
关于调用的方法,见”C++调用DLL“