VS2008 C++ 生成一个简单的DLL文件

最近刚入职到一家软件公司从事C++开发工作,在学校学习的编程内容到了工作中是远远不够用的,所以开始了自学之路,但由于我不是计算机科班出身的,所以这条路任重而道远。大家看到我的教程是一步步的来,从如何创建一个项目开始,请大家不要吃惊。

从接触简单的项目开始学起吧,先使用C++创建一个简单的DLL,到后面可以用C++进行调用,因为后面的工作中也需要调用别的公司的DLL。

一、动态链接库(DLL)简介

动态链接库英文为DLL,是Dynamic Link Library的缩写。DLL是一个包含可由多个程序,同时使用的代码和数据的库。在Windows中,这种文件被称为应用程序拓展。例如,在 Windows操作系统中,Comdlg32.dll执行与对话框有关的常见函数。因此,每个程序都可以使用该 DLL 中包含的功能来实现“打开”对话框。这有助于避免代码重用和促进内存的有效使用。 通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个计账程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。[1]

二、DLL生成的两种方式

在C++中,dll的生成主要有两种方法:一是使用__declspec(dllexport) 创建dll,二是使用模块定义(.def)文件创建dll。

方法1: 使用 __declspec(dllexport) 来创建dll

__declspec是Microsoft VC中专用的关键字,它配合着一些属性可以对标准C/C++进行扩充。__declspec关键字应该出现在声明的前面。

__declspec(dllexport)用于Windows中的动态库中,声明导出函数、类、对象等供外面调用,省略给出.def文件。即将函数、类等声明为导出函数,供其它程序调用,作为动态库的对外接口函数、类等。

1.创建一个MyDLL项目

首先我们选择创建项目,项目类型选择Visual C++ -> Win32,模版选择Win32项目,在合适的位置创建一个名为MyDLL的项目,单击确定并在弹出的向导中点击下一步。

应用程序类型选择DLL,附加选项选中空项目,单击完成。

在解决方案资源管理器中的源文件上单击右键选择添加->新建项,创建一个名为MyDLL的.cpp文件。

再以同样的方法在头文件上单击右键添加->新建项,创建一个名为MyDLL的.h文件。

2.添加代码到文件中

复制或输入以下代码到MyDLL.cpp文件中。

//MyDLL.cpp
#define DLL_EXPORT
#include "MyDLL.h"

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

int substract(int a, int b)
{
    return a - b ;
}

复制或输入以下代码到MyDLL.h文件中

//MyDLL.h
#ifdef DLL_EXPORT //如果在工程里已经添加预定义宏
      #define MYDLL_EXPORT extern "C" __declspec(dllexport) //那DLLEXPORT就指代__declspec(dllexport) 用于dll的导出
#else  //当工程中不包含DLL_EXPORTS预定义时
      #define MYDLL_EXPORT extern "C" __declspec(dllimport) //DLLEXPORT 就指代__declspec(dllimport)
#endif

//extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码

MYDLL_EXPORT int add(int a, int b);
MYDLL_EXPORT int sub(int a, int b);

3.生成解决方案

在解决方案资源管理器中的解决方案"MyDLL"上单击右键,选择生成解决方案,或者在编写完代码后直接按F7生成解决方案。

4.找到生成的dll文件

接下来就可以在你创建的项目文件夹下的Debug文件夹中找到你生成的MyDLL.dll文件,以及静态库文件MyDLL.lib文件了。

我们使用Depends软件来查看我们刚刚生成的dll文件,在Depends软件中打开我们刚刚生成的dll文件,或者拖动到软件中,我们就可以看到其中我们编写的add和sub功能了。

注:Depends软件下载及使用方法请自行百度。

方法2: 使用模块定义(.def)文件创建dll

.def文件(模块定义文件)是包含一个或多个描述各种DLL属性的Module语句的文本文件。.def文件或__declspec(dllexport)都是将公共符号导入到应用程序或从DLL导出函数。如果不提供__declspec(dllexport)导出DLL函数,则DLL需要提供.def文件。

1.创建一个MyDLL项目

与刚才的方法一样创建一个MyDLL项目,但不同的是,我们不用再创建一个MyDLL.h的头文件,而是在源文件中创建一个.def的模块定义文件。具体操作为,在解决方案资源管理器中的源文件上单击右键,选择添加->新建项,新建一个名为MyDLL的.def文件。

2.添加代码到文件中

复制或输入以下代码到MyDLL.cpp文件中。

//MyDLL.cpp
int add(int a, int b)
{
    return a + b;
}

int sub(int a, int b)
{
    return a - b ;
}

复制或输入以下代码到MyDLL.def文件中。

LIBRARY	"MyDLL"

EXPORTS
add @2
sub @1

其中LIBRARY语句用于指定动态链接库的名称,EXPORTS指明需要导出的函数,其中@加数字为导出函数的顺序,顺序可自行修改,也可以不加@数字,则导出的为默认顺序。

3.生成解决方案

以上述同样的方法生成解决方案,这里不再赘述。

4.查看生成的dll文件

在同样的位置找到刚刚生成的dll文件,并使用Depends软件来查看,这回生成的函数中我们可以注意到,函数的顺序号改变了,sub为1,add为2,与我们刚刚在.def模块定义文件中定义的一样。


以上就是使用VS2008 C++生成DLL动态库的两种方法,如果有内容写的不全或者不好的地方,请大家指正,或者大家有什么问题也欢迎留言讨论。

对于DLL调用的方式,我们下期再讲,感兴趣的同学可以先自行尝试。


参考资料:

[1]百度百科——.dll

https://baike.baidu.com/item/.dll/2133451?fr=aladdin#2

[2]extern “C”的作用详解

https://www.cnblogs.com/xiangtingshen/p/10980055.html

[3]__declspec(dllexport)与__declspec(dllimport)

https://blog.csdn.net/huangyimo/article/details/81748939

posted @ 2020-07-14 23:01  CokeFan  阅读(786)  评论(1编辑  收藏  举报