您的位置:首页 > 编程语言 > Qt开发

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

2014-11-10 13:22 309 查看
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)函数。如下图所示:



输出结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  visual c++ qt dll 编译器