1.创建动态库
新建项目,选择库->C++类,类型选择共享库,勾选上QtGui,完成以后在.pro文件中加上DESTDIR = ..\MyDebug表示生成的内容放到这个文件夹中。DESTDIR = $$PWD/Output/ 表示安置工作目录在当前路径的Output文件夹中。没有这个文件夹会新建一个,$$PWD表示当前路径。项目中把Shadow build勾掉。.cpp中可以加上自己写的东西。
可以新添加一个窗体用来测试,选择QT->QT设计师界面类,选择Dialog,在dialog.h中包含_global.h头文件。
//也可以创建MainWindow 在头文件里要加上 TESTWIDGETSHARED_EXPORT宏
//可以理解成需要把这个类dialog导出,就是将其编译成一个dll文件之后其他的类可以使用这个导出类
class TESTWIDGETSHARED_EXPORT MyDialog : public QDialog
{
Q_OBJECT
public:
explicit MyDialog(QWidget *parent = 0);
~MyDialog();
private:
Ui::MyDialog *ui;
};
在_global.h文件中
#include
//此文件定义了两个宏 TESTWIDGETSHARED_EXPORT 如果定义了TESTWIDGET_LIBRARY,那么
//TESTWIDGETSHARED_EXPORT 定义为Q_DECL_EXPORT,否则定义为Q_DECL_IMPORT。这个名字是把对象导出的语句
//要编写窗口在创建文件的时候要勾选QtGui
#if defined(TESTWIDGET_LIBRARY)
# define TESTWIDGETSHARED_EXPORT Q_DECL_EXPORT
#else
# define TESTWIDGETSHARED_EXPORT Q_DECL_IMPORT
#endif
构建一下就在debug文件夹中生成了.a和.dll文件,.a是在Linux中使用,.dll是Windows中使用。
2.使用动态库
新建一个Qt WidgetsApplication项目,然后在.pro文件中同样加上DESTDIR = ..\MyDebug 以及在项目中勾掉Shadow build,另外加上INCLUDEPATH += ../sld 和LIBS += -L$$DESTDIR -lsld
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
DESTDIR = ..\MyDebug
TARGET = uselib
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
INCLUDEPATH += ../TestWidget
LIBS += ../MyDebug/TestWidget.dll
这两句话第一句是让我们这个项目可以找到动态库TestWidget.h和TestWidget_global.h文件,需要把这里的路径换成符合需要的工程的路径。LIBS这一行告诉编译器到哪里找到这个dll文件。如果使用的vs编译器需要写成LIBS += -L$$DESTDIR -lTestWidget 。
然后可以试着调用之前写的程序
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "testwidget.h"
#include
#include "mydialog.h"
CMainWindow::CMainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::CMainWindow)
{
ui->setupUi(this);
}
CMainWindow::~CMainWindow()
{
delete ui;
}
void CMainWindow::on_pushButton_clicked()
{
MyDialog * my = new MyDialog(this);
my->show();\
QMessageBox *msg = new QMessageBox(this);
CTestWidget s;
msg->setText(s.GetStr());
msg->show();
}
在界面上添加一个按钮,调用显示先前文件的mydialog界面,在界面上创建一个显示框,框里显示textwidget里编写的程序。运行显示成功。
参考链接1
参考链接2