使用dll的形式开发项目,十分适合团队合作开发大型项目,易于扩展,库之间相对独立,可以独立编译,并且也可以保护源码。
本文Qt创建的动态链接库dll被称为驱动,本节演示如何创建动态链接库,并进行调用,最终实现UI上的加法器。
1.创建子目录项目
创建项目,选择“其他项目”–>“子目录项目”,
创建名称,选择地址
先不用添加子项目,选择“cancel”
生成的.pro文件中如图所示:
TEMPLATE = subdirs //代表生成一个子目录项目
2.创建主工程
添加一个子项目,在Plugin上右键,选择“新子项目”
打开后,选择“Application”–>“Qt Widgets Application”
将子项目“MainApp”添加到“Plugin.pro”中
点击“完成”,此时MainApp的.pro文件中内容如下图:
Plugin.pro中内容如下:
可以看到,多了SUBDIRS
,里面的MainApp
即为Plugin.pro
的子项目。
//MainApp为Plugin.pro的子项目
SUBDIRS += \
MainApp
多核编译设置:Qt做编译的时候默认是使用一个核运算,有些大的项目运行起来会特别慢,因此可以在项目中设置多多核编译。下图是设置为4核编译图。
对MainApp子项目进行编译
编译后MainApp内,地址设置的有些乱,后期设置时还是需要注意,此处就不改了:
3.创建库插件
添加一个库插件:
选择“Library”–>“C++库”
选择“共享库”
根据需要选择模块,此处只选择了“QtCore”
MathPlugin.pro的内部如下:
可以看到自动生成了“mathplugin_global.h”文件,内部如下图:
Plugin.pro中插入了MathPlugin插件
在MathPlugin.h和.cpp中设置加法函数:此处注意,在.h文件中声明了函数,自动在.cpp中生成函数实现的快捷键为Alt+Enter
#ifndef MATHPLUGIN_H
#define MATHPLUGIN_H
#include "mathplugin_global.h"
class MATHPLUGINSHARED_EXPORT MathPlugin
{
public:
MathPlugin();
~MathPlugin();
double add(double d1,double d2);
};
#endif // MATHPLUGIN_H
MATHPLUGINSHARED_EXPORT
跳转进去可以看到其为宏定义# define MATHPLUGINSHARED_EXPORT Q_DECL_EXPORT
,Q_DECL_EXPORT
是Qt定义的可以被外部模块引用的宏,其内部为# define Q_DECL_EXPORT __declspec(dllexport)
其中__declspec(dllexport)
为标准C++中定义的库可以被外部引用的宏定义,如果需要把QT代码写成C++形式就可以利用此。
4.UI创建
UI中添加对应“linedit”,“pushbutton”及“label”,在pushbutton上选择“转到槽”
5.为主工程设置库文件
界面创建好之后,怎么去使用插件MathPlugin
进行计算呢?
在MainApp上右键,选择“添加库”
选择“内部库”
选择MainApp中插入的库文件“MathPlugin”,选择平台为“Windows”,然后“next”
然后完成
MainApp.pro中就会增加下面红框中的内容
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../MathPlugin/release/ -lMathPlugin
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../MathPlugin/debug/ -lMathPlugin
指明release, debug两种模式下的路径
INCLUDEPATH += $$PWD/../MathPlugin
DEPENDPATH += $$PWD/../MathPlugin
添加工作目录到应用程序
6.添加加法功能代码及实现
mainwindow.cpp中添加#include "mathplugin.h"
及实现代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mathplugin.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_add_clicked()
{
MathPlugin math;
ui->lineEdit_add=math.add(QString::number(ui->lineEdit_d1->text(),ui->lineEdit_d2->text()));
}
如果添加了#include "mathplugin.h"
之后,显示找不到,可以将2个子工程分别编译即可解决问题。
7.运行结果及问题
整体进行构建,debug运行。
实现一个加法器的功能界面(本人的程序运行出来报错,但整个流程是没有问题的)
正常运行的提示:
我的出错提示:
8:07:21: 为项目Plugin执行步骤 ...
18:07:21: 正在启动 "C:\Qt\Qt5.9.4\5.9.4\msvc2017_64\bin\qmake.exe" D:\SelfProgram\QTTest\Plugin\MathPlugin\MathPlugin.pro -spec win32-msvc "CONFIG+=debug" "CONFIG+=qml_debug"
18:07:21: 进程"C:\Qt\Qt5.9.4\5.9.4\msvc2017_64\bin\qmake.exe"正常退出。
18:07:21: 正在启动 "C:\Qt\Qt5.9.4\Tools\QtCreator\bin\jom.exe" qmake_all
jom 1.1.2 - empower your cores
18:07:22: 进程"C:\Qt\Qt5.9.4\Tools\QtCreator\bin\jom.exe"正常退出。
18:07:22: 正在启动 "C:\Qt\Qt5.9.4\Tools\QtCreator\bin\jom.exe" -r -j4
-f Makefile.Debug
'-f' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
jom: D:\SelfProgram\QTTest\Plugin\MathPlugin\Makefile [debug] Error 1
18:07:22: 进程"C:\Qt\Qt5.9.4\Tools\QtCreator\bin\jom.exe"退出,退出代码 2 。
Error while building/deploying project Plugin (kit: Desktop Qt 5.9.4 MSVC2017 64bit)
When executing step "Make"
18:07:22: Elapsed time: 00:01.
等有时间了研究一下怎么回事