Qt引用Dll(C++)中的类

gxtdjh 2010-12-30 04:10:40
test.h
class __declspec(dllexport) test
{
public:
test(void);
~test(void);
int max(int a1,int b);
public:
int a;
};

test.cpp
#include "test.h"

test::test(void)
{
a=0;
}

test::~test(void)
{
}
int test:: max(int a1,int b)
{
a = (a1-b);
return a1+b;

}

这样写了一个简单的C++类,生成.lib和.dll两个文件
如何在Qt引用这个test类。而不是引用具体的函数。
...全文
1293 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
gxtdjh 2010-12-31
  • 打赏
  • 举报
回复
你这个库是在Qt下写的,测试了,是Ok的。
我的库是在Vs2008下编译生成的。
如果在Qt下引用是不是先要把库的源码在Qt下编译生成Dll文件啊!
不可以直接引用Vs2008下生成的库吗?
  • 打赏
  • 举报
回复
当然是行的,我做给你看:
先是Dll相关的内容:
Dll.h
#ifndef DLL_H
#define DLL_H
class __declspec(dllexport) Test
{
public:
void outPut();
};
#endif // DLL_H

Dll.cpp:
#include "Dll.h"
#include <QDebug>

void Test::outPut()
{
qDebug() << "dll sucess!" << endl;
}

Dll.pro:
TARGET = Dll
TEMPLATE = lib
HEADERS += \
Dll.h

SOURCES += \
Dll.cpp
编译,生成一个Dll.dll文件

接下来弄一个UseDll的Console工程,将dll.h复制到UserDll的工程目录

将Dll.Dll文件复制到UseDll工程的生成文件夹(注意是生成文件夹)下,在Qt Creator 2.0.1中是单独用一个文件夹来放的,我这里是UseDll-build-desktop,在以前的版本中是直接在工程文件下就可以了(就Debug的上层目录),因为连接的时候要在当前生成文件夹下开始寻找Dll库来链接
将Dll.h改动两个字符,这是改动后的Dll.h内容,仔细区别:
#ifndef DLL_H
#define DLL_H
class __declspec(dllimport) Test
{
public:
void outPut();
};
#endif // DLL_H

最后修改.Pro文件,增加下面这一行:
LIBS += Dll.dll//表示编译的时候要连接此指定的库,如果Dll.Dll不是放在生成文件夹,就要指定路径
行了,主函数如下:
#include <QtCore/QCoreApplication>
#include "Dll.h"

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Test t;
t.outPut();
return a.exec();
}

编译运行!
如果不在Qt Creator里运行程序,比如在资源管理器双击的话,就要将Dll.dll放在.exe文件相同目录,否则会提示找不到库的错误

我这里测试通过,你试试,不行就把错误贴出来,一般是路径没整对
巴依老爷 2010-12-31
  • 打赏
  • 举报
回复
导出c++类以及使用必须在同一编译环境下,否则会有ABI兼容问题
gxtdjh 2010-12-31
  • 打赏
  • 举报
回复
yangglemu ,我试了下你的方法,怎么不行呢,你这样用过吗?
shegood1985 2010-12-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gxtdjh 的回复:]

你这个库是在Qt下写的,测试了,是Ok的。
我的库是在Vs2008下编译生成的。
如果在Qt下引用是不是先要把库的源码在Qt下编译生成Dll文件啊!
不可以直接引用Vs2008下生成的库吗?
[/Quote]
用 extern "C" 导出

不让编译器改名字
  • 打赏
  • 举报
回复
不同的编译器,改编名字的规则有差异
我在VS里加了DEF模块定义文件,用工具查看导出的函数名都是C风格的函数名,到了QT里,它个笨家伙还是按自己加工过的名字_imp__Z6XXXv去找
  • 打赏
  • 举报
回复
讲一种方法,也是用的最多的方法(隐式加载动态库)
1,需要用到头文件和Dll,一齐拷贝到当前工程目录(就是要使用DLL的工程)
2,把头文件稍改一下,导出改为导入:
class __declspec(dllimport) test
{......};
3,在Pro文件中加上对应的Dll(或者Lib)
LIBS += MyDll.dll
OK,小功告成,你现在可以在工程中任意使用test类了
kongyanmin 2010-12-30
  • 打赏
  • 举报
回复
看QLibrary 调用动态库
目 录 第一章 开发环境 1.1 Qt 简介5 1.2 下载安装 Qt Creator 6 1.3 第一个程序 Hello World 7 第二章 窗体应用 1.1 窗体基说明 12 1.2 控制窗体大小 13 1.3 窗体初始位置及背景色 13 1.4 修改标题栏图标 14 1.5 移动无边框窗体 16 1.6 去掉标题栏最大化、最小化按钮 17 1.7 多窗体调用 18 1.8 字体形状窗体 20 第三章 控件应用 1.1 QPushButton按钮 23 1.2 QLabel标签 23 1.3 QLineEdit单行文本 24 1.4 QTextEdit多行文本 25 1.5 QPlainTextEdit多行文本 26 1.6 QComboBox下拉列表框 26 1.7 QFontComboBox字体下拉列表框 27 1.8 QSpinBox控件 28 1.9 QTimeEdit时间控件 29 1.10 QDateEdit日期控件 30 1.11 QScrollBar控件 30 1.12 QRadioButton单选按钮 31 1.13 QCheckBox复选框 32 1.14 QListView 列表控件 34 1.15 QTreeView树控件 34 1.16 QTableView表格控件 35 1.17 QHBoxLayout横向布局 36 1.18 QGridLayout网格布局 37 1.19 QGroupBox控件 38 1.20 QTabWidget控件 39 1.21 QMenu、QToolBar控件 41 1.22 任务栏托盘菜单 43 第四章 组件应用 1.1日历组件 47 1.2登录窗口 48 1.3文件浏览对话框 50 1.4颜色选择对话框 51 1.5进度条实例53 1.6Timer实时更新时间 54 第五章 文件操作 1.1创建文件夹 57 1.2写入文件 58 1.3修改文件内容 60 1.4删除文件 62 1.5修改文件名 63 1.6 INI文件写入操作 65 1.7 INI文件读取操作 68 1.8创建XML文件 71 1.9读取XML文件 72 第六章 图形图像操作 1.1绘制文字 75 1.2绘制线条 75 1.3绘制椭圆 77 1.4显示静态图像 78 1.5显示动态图像 78 1.6图片水平移动 79 1.7图片翻转 80 1.8图片缩放 82 1.9图片加文字 84 1.10图像扭曲 85 1.11模糊效果 85 1.12着色效果 86 1.13阴影效果 87 1.14透明效果 87 第七章 多媒体应用 1.1音频、视频播放器 90 1.2播放Flash动画 94 1.3播放图片动画 95 第八章 系统操作 1.1获取屏幕分辨率 98 1.2获取本机名、IP地址 98 1.3根据网址获取IP地址 99 1.4判断键盘按下键值 100 1.5获取系统环境变量 101 1.6执行系统命令 102 第九章 注册表 1.0简要说明注册表 105 1.1写入注册表 105 1.2查找注册表 106 1.3修改IE浏览器的默认主页 107 第十章 数据库基础 1.1查询数据库驱动 109 1.2Qodbc连接Access数据库 109 1.3插入数据 111 1.4数据列表 112 1.5操作SQLite数据库 113 1.6SQLite数据库视图管理器 115 第十一章 网络开发 1.1点对点聊天服务端 119 1.2点对点聊天客户端 123 1.3局域网广播聊天 128 1.4SMTP协议发送邮件 148 1.5调用系统DLL判断网络连接状态 152 第十二章 进程与线程 1.1进程管理器 155 1.2线程QThread应用 158 1.3线程QRunnable应用 159 第十三章 数据安全 1.1 QByteArray加密数据 163 1.2 AES加密数据 164 1.3 MD5 加密数据 165 1.4 生成随机数 166 第十四章 打包部署 1.1 FilePacker 打包 169 1.2 Inno Setup 打包 174

16,215

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧