【C++】DLL文件的编写与实现——三步走

本文详细介绍了DLL(动态链接库)的概念、作用及如何在C++中创建和使用DLL。通过创建DLL文件,实现代码的封装和复用,节省内存。文章还展示了从创建DLL项目到在另一个Win32控制台程序中调用DLL函数的完整步骤,包括头文件、源文件的编写以及项目配置。最后,解释了DLL与EXE之间的链接关系,并提供了查看DLL导出函数和EXE导入库的命令。
摘要由CSDN通过智能技术生成

一、DLL是什么?

 动态链接库(Dynamic Link Library)DLL文件与EXE文件一样也是可执行文件,但是DLL也被称之为库,因为里面封装了各种类啊,函数啊之类的东西,就像是一个库一样,存储着很多东西,主要是用来调用的。调用方式主要分为两种:隐式(通过lib文件与头文件) 与 显式(只通过DLL文件)。

(这是一条弹幕:2019.5.10 很多人私信我 我肥来说下 ,调用方是需要使用三件套的就是.h\.lib\.dll。只使用dll和lib调用的话,我再写一篇好了 地址在这边(点我点我) )

二、为什么使用DLL?

     微软方面一边开源了很多代码,比如MFC的,这些代码是直接暴露在程序员眼皮子底下的,和容易调用,当然也很容易与程序员的代码发生冲突,业内也称之为“白盒复用”,有一定的优势,但是也有弊端。在此基础上,我们再来聊DLL就比较好,DLL将要一系列的代码转化成二进制,直接供程序使用,称之为“黑盒复用”。

动态链接库DLL最大的好处就是节省内存,程序在没有运行到dll里的函数的时候,dll里的函数就没有运行,只有在运行到了dll,才通过dll的接口函数访问dll,这样比直接把函数代码写到主题函数,或静态链接库相比,运行的效率有了很大的提高.其次使用DLL文件编程,其更新也较为方便,不需要与程序链接。

三、怎么样使用DLL?

1.首先创建一个空的DLL文件,创建方法:新建——项目——Win32控制台程序——然后取个名字——确定——下一步——选择DLL——勾选空白项目。顺利新建了项目。

2.然后我们在头文件下创建一个头文件这里我们是DLL1.h,输入如下代码:

#ifdef CREATEDELL_API_DU
#else                                                                            
#define CREATEDELL_API_DU _declspec(dllimport) //当编译时,头文件不参加编译,所以.cpp文件中先定义,后头文件被包含进来,因此外部使用时,为dllexport,而在内部编译时,则为dllimport
#endif                                         
 
class CREATEDELL_API_DU animal              //需要被外界调用的类(父类)
{
public:
    virtual int outDate() = 0;                 //纯虚函数
    void getWide(int x);    
    void getHigh(int y);
 
protected:
    int wide;
    int high;
};
 
                                                
class CREATEDELL_API_DU cat:public animal      //需要被调用的类(子类cat)
{
public:
    int outDate();
};
 
 
class  CREATEDELL_API_DU dog :public animal     //需要被调用的类(子类dog)
{
public:
    int outDate();
};
 
int CREATEDELL_API_DU exportDate();             //需要被调用的函数(单独的一个函数,不属于任何一个类)


3.在源文件下创建源文件,这里名字为DLL1.cpp,并插入以下代码:

#define CREATEDELL_API_DU _declspec(dllexport)
 
#include <iostream>
#include "DLL1.h"
using namespace std;
//父类中函数实现 
void animal::getWide(int x) {
     wide = x;
}
void CREATEDELL_API_DU animal::getHigh(int y){
     high = y;
}//子类cat中数据输出实现
int CREATEDELL_API_DU cat::outDate(){
     return (wide + high);wide += wide;high += high;
}//子类dog数据输出实现
int CREATEDELL_API_DU dog::outDate(){
     return (wide - high);
}//函数的实现
int CREATEDELL_API_DU exportDate(){
     return 666;
}

 4.点击生成即可,DLL虽然是可执行文件但是是无法调试的,当你点调试的时候,会提示如下:

  

5.当生成完之后,我们便可以在项目文件夹下的Debug文件夹中看到DLL1.dll与DLL1.lib,并且在项目文件夹下的DLL1中看到DLL1.cpp。(忽略图表中的绿锁标志)

 那么到这里,我们的DLL算是全部搞定了

接下来需要重新新建一个Win32的控制台程序,打开工程,首先引入三个文件,也就是上面看到的.lib   .h  .dll三个。

工程——属性——配置属性——VC++目录。

包含目录:添加.h所在的文件夹

库目录:添加。lib所在的文件夹

添加后如下:

 最后在链接器——输入——附加依赖项中添加DLL1.lib,并且确定。

 最后将DLL文件放到新的工程项目的DEBUG目录下

       

到此添加库成功,现在我们去用代码实现:

在源文件中新建一个新的源文件,这里为test.cpp,并添加如下代码:

#include<iostream>
#include"test.h"
#include"DLL1.h"
using namespace std;
bool main()
{
    
    cout << exportDate()<<endl;          //调用函数输出666   
 
 
    dog dog;     //实例化dog对象、赋值、并输出。
    dog.getHigh(5);
    dog.getWide(6);
    cout << dog.outDate() << endl;
 
    cat cat;    //实例化cat对象、赋值、并输出
    cat.getHigh(16);
    cat.getWide(4);
    cout << cat.outDate()<< endl;

    getchar();          //让程序处于等待输入状态下,而不是一闪而过
    return 0;
}

最后编译——运行,得到以下结果:

 补充:

可在dLL所在目录使用dumpbin -exports xxx.dll命令行来查看某dll中的函数.

可在EXE所在的目录下使用dumpbin -imports xxx.EXE来查看某EXE文件使用过哪些dll库.

64位EXE尽量去调用64位DLL,同理32位尽量调用32位。

显示调用可以参考这篇文章:C++编写一个简单的DLL
————————————————
版权声明:本文为CSDN博主「windmeeeeee」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34097715/article/details/79540933

补充:错误 

Error C2375 'onnx_inference::initModel': redefinition; different linkage

在头文件中未给类定义添加CREATEDELL_API_DU修饰时,cpp中类成员函数会出现以上错误。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值