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

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

准备dll文件:

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

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

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

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

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

然后完成。

新建头文件simpledll.h。

新建cpp文件simpledll.cpp文件。

在头文件simpledll.h中输入:

[cpp] view plain copy
  1. #pragma once;   
  2.    
  3. #ifdef DLL_IMPLEMENT   
  4. #define DLL_API __declspec(dllexport)   
  5. #else   
  6. #define DLL_API __declspec(dllimport)   
  7. #endif   
  8.    
  9. //导出类   
  10. class DLL_API SimpleDll   
  11. {   
  12.          public:   
  13.                    SimpleDll();   
  14.                    ~SimpleDll();   
  15.    
  16.                    intadd(int x, int y);    
  17. };   
  18.    
  19. extern "C" __declspec(dllexport)int SubAdd(int x,int y);  

在cpp文件simpledll.cpp中输入:

[cpp] view plain copy
  1. #define DLL_IMPLEMENT    
  2.    
  3. #include "simpledll.h"   
  4.    
  5. SimpleDll::SimpleDll()   
  6. {   
  7. }   
  8. SimpleDll::~SimpleDll()   
  9. {   
  10. }   
  11. int SimpleDll::add(int x, int y)   
  12. {   
  13.                    returnx+y;   
  14. }  
  15. int __declspec(dllexport) SubAdd(int x,inty)  
  16. {  
  17.          returnx+y;  
  18. }  

编译生成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)。调试器可以先不管。

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


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


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

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文件中的函数

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

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

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

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

输出结果:

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