QT5编写和调用DLL动态库的终极实践
DLL编写和调用详细教程(附过程截图)

1.新建一个 Dll 工程,工程名 MyDll 步骤 Win 程序-> DLL -> 完成 会自动生成一个 MyDll.cpp、dllmain.cpp、stdafx.cpp、 targetver.h、stdafx.h 共个文件 在创建 Dll 工程中,勾选导出符号,会自动添加 MyDll.h
这里需要 lib 文件,不选择删除操作
5.新建调用工程,调整依赖关系、启动项 右键 MyDll 解决方案->添加->新建项目这里选择常见默认的 Win32 控制台应用程序 右键调用 Dll 函数->项目依赖项->勾选 MyDll,在右键设置为启动项目
6.调用 dll 的内部函数 写入以下代码 // 调用 Dll 函数.cpp : 定义控制台应用程序的入口点。 #pragma comment (lib,"MyDll.lib")
2015 年 5 月 15 日星期五
()那如何生成 lib 文件呢? 也是右键解决方案,添加-> 新建项,选择 m 模块定义文件(.def) 在编译一次就生成了 lib 文件,还有 MyDll.dll 文件
()取消 lib 文件的生成 在解决方案的属性中->配置属性->链接器->输入-def 在重新编译就可以了。
#ifdef MYLIBDLL #define MYLIBDLL extern "C" _declspec(dllimport) #else #define MYLIBDLL extern "C" _declspec(dllexport) #endif //这里就定义了一个函数 add MYLIBDLL int Add(int one, int two); MYLIBDLL int Mul(int one, int two); */ #endif 这里还有非常关键的一步,就在 MyDll.cpp 中添加头文件 #include "MyDll.h"//这一句别忘记了,否则后面调用函数编译不了
QT调用DLL方法(三种方法)

QT调⽤DLL⽅法(三种⽅法)Qt调⽤DLL⽅法⼀:使⽤Win32 API在显式链接下,应⽤程序必须进⾏函数调⽤以在运⾏时显式加载 DLL。
为显式链接到 DLL,应⽤程序必须:调⽤ LoadLibrary(或相似的函数)以加载 DLL 和获取模块句柄。
调⽤ GetProcAddress,以获取指向应⽤程序要调⽤的每个导出函数的函数指针。
由于应⽤程序是通过指针调⽤ DLL 的函数,编译器不⽣成外部引⽤,故⽆需与导⼊库链接。
使⽤完 DLL 后调⽤ FreeLibrary。
例如:typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);HINSTANCE hDLL; // Handle to DLLLPFNDLLFUNC1 lpfnDllFunc1; // Function pointerDWORD dwParam1;UINT uParam2, uReturnVal;hDLL = LoadLibrary(”MyDLL”);if (hDLL != NULL){lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,“DLLFunc1″);if (!lpfnDllFunc1){// handle the errorFreeLibrary(hDLL);return SOME_ERROR_CODE;}else{// call the functionuReturnVal = lpfnDllFunc1(dwParam1, uParam2);}}需要说明的是,typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);是声明想要调⽤的函数指针,这个函数的参数必须和DLL⾥⾯的⼀样。
DLLFunc1是DLL⾥⾯的“实际的函数名”,必须和头⽂件⾥⾯声明的⼀样,否则将会调⽤失败。
使⽤需要加Windows.h 头⽂件。
QT自定义工程封装成DLL,并在另一个QT程序中使用

QT⾃定义⼯程封装成DLL,并在另⼀个QT程序中使⽤⾸先新建⼀个Library⼯程命名为WidgetLib ,之后就默认下⼀步即可,如果需要添加额外的模块,可以在.pro⽂件中语句QT += 后⾯⾃⼰添加⼯程新建之后⽂件列表如下所⽰此时的⽂件中还没有ui⽂件,如果要封装带界⾯的动态库,需要右键点击⼯程->add new在新弹出的窗⼝中选择Qt -> Qt设计师界⾯类将其命名为与当前⼯程相同的名字,以覆盖之前不带ui界⾯的⽂件。
之后会弹出如下两个窗⼝,分别点击OK 和 Yes to All此时可以看到新的⼯程⽂件下⾯多出了 .ui⽂件不过此时的⼯程还不能直接打包成动态库,因为旧的⽂件被覆盖掉了,新的⽂件⽆法打包成动态库,因此需要对新的⽂件进⾏修改此时新的widgetlib.h⽂件内容如下#ifndef WIDGETLIB_H#define WIDGETLIB_H#include <QWidget>namespace Ui {class WidgetLib;}class WidgetLib : public QWidget{Q_OBJECTpublic:explicit WidgetLib(QWidget *parent = nullptr);~WidgetLib();private:Ui::WidgetLib *ui;};#endif// WIDGETLIB_H需要将其修改为下⾯的内容#ifndef WIDGETLIB_H#define WIDGETLIB_H#include <QWidget>#include "widgetlib_global.h"namespace Ui {class WidgetLib;}class WIDGETLIBSHARED_EXPORT WidgetLib : public QWidget{Q_OBJECTpublic:explicit WidgetLib(QWidget *parent = nullptr);~WidgetLib();private:Ui::WidgetLib *ui;};#endif// WIDGETLIB_H即:需要添加头⽂件 #include "widgetlib_global.h" 以及在类名前添加 WIDGETLIBSHARED_EXPORT 语句。
VS使用QT5.2.1动态库的方法

VS使用QT5.2.1动态库的方法使用QT创建项目需更改VS2013配置,操作步骤如下:1、打开VS2013,点击菜单栏中“QT5”->选择“Qt Option”,弹出如下窗口:2、添加QT静态库文件路径,并选择对应版本。
2、单击“QT5”->选择“Qt Project ”,弹出如下窗口,选择Version为静态库版本。
3、右键QT项目,选择“属性” 弹出如下窗口:如图上红框所示,配置该选项。
4、右键QT项目,选择“属性”,弹出如下窗口:如图红框所示配置信息,【附加依赖项】配置为:PocoFoundationd.lib;AfcFrameworkd.lib;DevBased.lib;imm3 2.lib;winmm.lib;Ws2_32.lib;opengl32.lib;qwindowsd.lib;Qt5PlatformSupportd.lib;wsock32.lib;qtm aind.lib;Qt5Cored.lib;Qt5Guid.lib;Qt5Widgetsd.lib;%(AdditionalDependencies)5、右键QT项目,选择“属性”,弹出如下窗口:如图红框所示配置信息,【附加库目录】配置为:$(QTDIR)\plugins\platforms;$(QTDIR)\lib;%(AdditionalLibrar yDirectories)6、QT项目启动cpp中加入如下:如图红框代码:#include#include"Poco/Foundation.h"#ifdef POCO_OS_FAMILY_WINDOWSQ_IMPORT_PLUGIN( QWindowsIntegrationPlugin ); #endif。
QT生成动态链接库及调用详细步骤

QT⽣成动态链接库及调⽤详细步骤
1. ⾸先新建⼀个⼯程(该篇⽂章共有两个不同的⼯程,注意区分,⼀个是有UI界⾯的,⼀个是没有UI界⾯的)
2.接下来选择库模板
3.选择共享库,取个该动态链接库的名字,下⼀步
5.继续下⼀步,直到点击完成。
6.点击项⽬,勾掉Shadow build,使.dll不⽣成在debug⽬录中,⽣成在我们⾃⼰创建的⽬录下⾯,⽅便查找和使⽤。
7.在.pro⽂件中,添加如下代码
DESTDIR =..\MyDebug
使⽣成的.dll⽂件放在该⽬录下,⾃动创建该⽬录。
8.点击运⾏,即可⽣成。
(此弹框不⽤管它,代表编译成功,已⽣成⽂件)
9.调⽤⽅法有两种:
(1)在.pro⽂件中,添加如下代码,并将Save_Data.h 添加到⼯程项⽬中(这步应该都会,添加现有⽂件),需要⽤到该动态链接库的地⽅就 #include 进去。
需要注意的⼀点就是:需要把以上⽣成的⽂件放置到⽣成的E:\cpptest\build-test_dll-
Desktop_Qt_5_7_0_MinGW_32bit-Debug\debug ⽬录下。
LIBS += libgdi32#这个也不能少。
少了会出错
win32:LIBS += "E:/cpptest/MyDebug/Save_Data.dll"
win32:LIBS+= -LE:/cpptest/MyDebug/ -lSave_Data
(2)在.pro⽂件中,添加如下代码,并将Save_Data.h ⽂件放置在与⼯程⽂件同⽬录⽂件中,需要⽤到该动态链接库的地⽅就 #include 进去。
⽐如我的,看图⼀⽬了然:。
QTCreator调用动态库实例讲述

在linux中,qt里面已经集成了最新的开发平台QT Creator,下面是我练习调用动态库(.so文件)的例程:1、打开QT Creator,点击File-》New...菜单,选择C++ Libarary工程,点击下一步,输入工程名称(本例为zsz)即可,这没什么可说的。
工程文件(.pro)程序清单# -------------------------------------------------# Project created by QtCreator 2009-03-02T10:09:35# -------------------------------------------------TARGET = zszTEMPLATE = libCONFIG += pluginDEPENDPATH += .INCLUDEPATH += .SOURCES += mylib.cppHEADERS += mylib.hmylib.h文件程序清单:#ifndef MYLIB_H#define MYLIB_H#ifdef Q_WS_WIN //表示在windows环境#define MY_EXPORT __declspec(dllexport)#else#define MY_EXPORT#endifclass mylib {public:int mymax(int i, int j);int add(int i, int j);};extern "C" MY_EXPORT int diff(int i, int j);#endif // MYLIB_Hmylib.cpp文件程序清单:#include "mylib.h"extern "C" MY_EXPORT int mylib::mymax(int i,int j){if(i>=j)return i;elsereturn j;}extern "C" MY_EXPORT int mylib::add(int i,int j){return i+j;}extern "C" MY_EXPORT int diff(int i, int j){if(i>=j)return i-j;elsereturn j-i;}对该工程进行编译,生成libzsz.so文件。
Qt下开发及调用带界面的DLL

Qt下开发及调⽤带界⾯的DLL0.背景由于某项⽬需要,在Qt下开发及调⽤带界⾯的DLL。
由于中间折腾时间较长才搞定,在这记录⼀下。
本帖⼦中所⽤Qt版本为QtCreator 4.10.2.基于Qt5.13.2(MSVC 2017,32位)1. Qt DLL开发1.1 ⼯程建⽴新建⼯程,选择:Library->C++ Library在⼯程细节中Qt module中选择 Widgets,如下图所⽰:⽣成的项⽬中⽂件列表如下:其中,在LaerRangerDLL_globall.h中,定义了宏# define LASERRANGERDLL_EXPORT Q_DECL_EXPORT查看Q_DECL_EXPORT的定义可以看出# define Q_DECL_EXPORT __declspec(dllexport)该定义即为dll导出符号的宏定义。
1.2 添加窗体新建窗体,选择Qt->Qt 设计师界⾯类,如下图所⽰:选Main Window,并添加到之前的项⽬:在窗体中加⼊⼀个Label,并修改显⽰字符串为:LaserRangerDLL。
然后修改LaserRangerDLL的头⽂件和源⽂件:头⽂件中做如下修改:头⽂件中添加ui_mainwindow.h和QWidget头⽂件并将给LaserRangerDLL类添加基类:QMainWindow,并修改其构造函数原型。
添加私有成员:Ui::MainWindow ui;修改源⽂件如下:在构造函数⾥添加ui.setupUi(this);1.3 ⽣成DLL在项⽬上点击右键:构建,⽣成DLL和Lib。
则在⼯程对应的Debug(或Release,和构建配置有关)⽂件夹⾥⽣成LaserRangerDLL.dll和LaserRangerDLL.lib⽂件。
2. 调⽤DLLDLL调⽤分为两种:隐式调⽤和显式调⽤。
其中,隐式调⽤是在编译时包含.lib⽂件和.h头⽂件,这两个⽂件中包含了动态库中导出的接⼝信息。
qt5开发及实例源代码

qt5开发及实例源代码一、Qt5开发简介Qt5是一款跨平台的C++图形用户界面应用程序开发框架,由挪威公司Trolltech(现在为Digia)开发。
它可以在Windows、macOS、Linux和其他操作系统上运行,是一个功能强大的GUI编程工具包。
Qt5提供了许多基本控件和高级控件,可以轻松地创建漂亮的用户界面。
同时,它还提供了许多工具和类来处理网络通信、数据库访问、XML解析等常见任务。
二、Qt5开发环境搭建1. 安装Qt5在官网上下载适合自己操作系统的Qt安装包,并按照提示进行安装。
2. 配置Qt Creator打开Qt Creator,选择Tools -> Options -> Kits,在这里添加一个新的Kit,选择对应的编译器和平台。
3. 创建一个新项目在File -> New File or Project中选择相应类型的项目并设置项目名称和路径。
三、Qt5实例源代码以下是几个简单的例子,展示了如何使用Qt5进行GUI编程:1. Hello World#include <QApplication>#include <QLabel>int main(int argc, char *argv[]){QApplication app(argc, argv);QLabel *label = new QLabel("Hello World!");label->show();return app.exec();}2. Button Clicked#include <QApplication>#include <QPushButton>int main(int argc, char *argv[]){QApplication app(argc, argv);QPushButton *button = new QPushButton("Click me!"); QObject::connect(button, SIGNAL(clicked()), &app, SLOT(quit()));button->show();return app.exec();}3. Dialog#include <QApplication>#include <QDialog>#include <QLabel>#include <QPushButton>int main(int argc, char *argv[]){QApplication app(argc, argv);QDialog *dialog = new QDialog;QLabel *label = new QLabel("Hello World!", dialog);QPushButton *button = new QPushButton("Close", dialog); QObject::connect(button, SIGNAL(clicked()), dialog,SLOT(close()));label->move(50, 50);button->move(100, 100);dialog->show();return app.exec();}以上代码仅供参考,更多实例请查看Qt官方文档。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
QT5编写和调用DLL动态库的终极实践如今,使用QT编程的人越来越多,但由于缺乏相关的中文文档,使得大家在学习的过程中偶有碰壁,网上的大多也有疏漏税,即使照着做也未必能成功。
今天给大家讲讲QT5.02编写和调用DLL动态库的编程实践,按照以下方法可以确保你对DLL编写和调用少走变路。
步聚一:
编写所需的DLL文件,如下图创建C++库文件工程。
类型选择此处选的是动态库。
工程名dll,生成的类名为Dll。
如下图,在dll.h 头文件中加入函数SHOW。
在dll.cp中编写该函数的实现。
此处我让函数打开一个窗口并在应用程序输出中输出“OK”字符。
顺便讲一下在DLL编写时如何加入容积资源文件。
依次点击“文件”菜单选择“新建文件或项目”然后如图选择“QT设计师界面类”
生成的文件及类名如下图:
#include"dll.h"
#include"qdebug.h"
#include"dialog.h"
Dll::Dll()
{
}
void Dll::show(){
Dialog*wi=new Dialog();
wi->show();
qDebug()<<"ok";
}
到这里,DLL文件的编写结束。
最后一步就是构建该程。
在该程名字上点鼠标右键,再选择构建。
接下来编写测试工程,类型为QT GUI应用。
工程名字为PO,
在po.pro文件中加入LIBS+=..\dll.DLL,完整代码如下:
#-------------------------------------------------
#
#Project created by QtCreator2013-08-06T10:19:12
#LIBS+="D:\c\po\dll.dll"
#-------------------------------------------------
QT+=core gui
greaterThan(QT_MAJOR_VERSION,4):QT+=widgets
TARGET=po
TEMPLATE=app
LIBS+=..\dll.DLL
SOURCES+=main.cpp\
mainwindow.cpp
HEADERS+=mainwindow.h\
dll.h\
dll_global.h
FORMS+=mainwindow.ui
在mainwindo.ui加一个按纽,并添加单击槽函数。
完整代码如下:
#include"mainwindow.h"
#include"ui_mainwindow.h"
#include"dll.h"
MainWindow::MainWindow(QWidget*parent):
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
Dll*pd=new Dll();
pd->show();
}
此处切记导入dll.h 头文件。
关键步聚来了,我们需要把dll工程中的所有头文件COPY到po工程目录下,并且在po工程名上点右键选择“添加现有文件”,把COPY过来的头文件全部加入到工程的树型列表中。
并且把dll工程生成的DLL文件COPY到po工程的debuG目录下。
路径搞不清的的看图,很多网上教程没说这一步,其实这才是大家调
用不成功的关键原因之一。
最终运行效果如下:。