Qt中隐式调用VS建立的dll动态库

Dll文件调用方式分为显式调用和隐式调用,在这里选择隐式调用的方式。

准备dll文件:

这里选择VS 2010作为dll的开发工具,打开vs 2010,选择文件->新建->项目

在新建项目窗口中选择左侧的Visual C++,选择其下面的Win32,再选择Win32项目,项目名称为SimpleDll。


下面选择下一步,在向导页面中选择dll,空的项目,如下图所示:


然后完成。

新建头文件simpledll.h。

新建cpp文件simpledll.cpp文件。

在头文件simpledll.h中输入:

#pragma once; 
 
#ifdef DLL_IMPLEMENT 
#define DLL_API __declspec(dllexport) 
#else 
#define DLL_API __declspec(dllimport) 
#endif 
 
//导出类 
class DLL_API SimpleDll 
{ 
         public: 
                   SimpleDll(); 
                   ~SimpleDll(); 
 
                   intadd(int x, int y);  
}; 
 
extern "C" __declspec(dllexport)int SubAdd(int x,int y);


在cpp文件simpledll.cpp中输入:

#define DLL_IMPLEMENT  
 
#include "simpledll.h" 
 
SimpleDll::SimpleDll() 
{ 
} 
SimpleDll::~SimpleDll() 
{ 
} 
int SimpleDll::add(int x, int y) 
{ 
                   returnx+y; 
}
int __declspec(dllexport) SubAdd(int x,inty)
{
         returnx+y;
}


编译生成dll文件和lib文件。(在debug目录中)

如果编译失败,可能的问题是链接器的配置问题,在项目属性页面,选择配置属性下面的链接器,在常规页面中,将右侧的启用增量链接设置为否即可。

隐式调用:

1,  配置开发环境:因为dll的编译环境是VS开发环境,使用的编译器是msvc编译器,所以如果QT使用MinGW编译器,则会调用失败,编译的时候出错,因为两个编译器的命名方式不同,dll中的函数名将识别不了。

解决方法:安装vs的Qt版本,去官网上下载。我这里选择的是

Qt libraries 4.8.6 for Windows (VS 2010, 236 MB)

安装好后,打开Qt Creator,在工具->选项->构建和运行中再添加一个构建套件,名字可以命名为VS,编译器选择Microsoft Visual C++ Compiler 10.0(x86),Qt版本选择Qt 4.8.6(如果找不到的话要先在Qt版本的选项卡下添加新的Qt 4.8.6)。调试器可以先不管。






2,  准备DLL库文件:因为这里选择的是隐式调用方式,所以需要以下三个文件才可以调用成功,比如要调用SimpleDll.dll文件,则还需要SimpleDll.h,SimpleDll.lib这两个文件,一共三个文件。

3,  调用DLL库文件:打开要调用dll文件的工程文件,比如叫UseSimpleDll.pro。将SimpleDll.h文件放到工程目录中,在项目窗口的工程名称上右击,选择添加现有文件,找到刚才的SimpleDll.h,添加该头文件,打开该头文件,如果没有以下宏定义:

#ifdefDLL_IMPLEMENT 

#defineDLL_API __declspec(dllexport) 

#else 

#defineDLL_API __declspec(dllimport) 

#endif

(DLL_API可以是其他字符)

那么将所有的__declspec(dllexport)改成__declspec(dllimport)。意思是将这里面的函数标记为导入的。

右键项目窗口中的工程文件名,选择添加库,在添加库页面中选择外部库,下一步,在选择库的编辑框中,浏览选择我们准备好的SimpleDll.lib文件,因为是在windows平台,所以取消掉Linux和Mac的选项,右侧选择动态,下面的windows选项可以不选。然后下一步,确定,会发现UseSimpleDll.pro文件中被添加了以下语句:

win32:LIBS += -L$$PWD/ -lsimpledll

 

INCLUDEPATH+= $$PWD/

DEPENDPATH += $$PWD/

         意味着添加库成功。

在把SimpleDll.dll添加到该工程的debug文件目录中,如果构建选择release,则放到release目录中。

4,  使用DLL文件中的函数

现在就可以直接调用库中的函数了,比如我在头文件中已经声明了一个函数和一个类,如下图所示


那么我就可以在我的.cpp文件中调用里面声明的函数了,比如我在main.cpp中调用SubAdd(int x,int y)函数,并建立一个SimpleDll的对象,调用该对象的add(int x,int y)函数。如下图所示:


输出结果:




  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值