Qt导出C++类和Qt静态方式加载DLL

    本文主要介绍如何使用QCreator新建包含Qt库的C++导出类(DLL)和如何在Qt工程中调用DLL中的C++类。整个实验的步骤如下:


一、宿主工程(调用者)

1,打开QCreator,新建一个名为“Host”的Qt GUI工程(除名字外,全部默认)。

2,构建并运行Host工程,产生“MainWindow”窗口。

3,确认测试正常,关闭窗口,并关闭Host工程。


二、Library工程

1,用QCreator新建C++库,名为“Library”。



2,选择需要的Qt库模块。



  注:如上图,你可以选择GUI和Widgets等模块。


3,添加测试信息。

    我在导出类“Library”的构造函数中添加了一行打印信息,如下:

#include "library.h"


Library::Library()
{
    qDebug("Create class 'library' successfully!");
}


4,将导出头文件和“*_global.h”文件拷贝到Host工程目录下,并包含到Host的搜索路径中。

    事实上,我们可以将“*_global.h”合并到导出头文件中,它的内容比较少,就只有一个导入导出声明。

#ifndef LIBRARY_GLOBAL_H
#define LIBRARY_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(LIBRARY_LIBRARY)
#  define LIBRARYSHARED_EXPORT Q_DECL_EXPORT
#else
#  define LIBRARYSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // LIBRARY_GLOBAL_H

注:“LIBRARRY_LIBRARY”宏是在Library.pro文件中定义的。


5,构建Library工程,将生成*.lib,*.dll,*.a三个输出文件。


三、加载测试

1,拷贝导出头文件到Host工程目录下,并在host.pro文件添加该路径。

2,右键Host工程的目录窗口的工程目录树的根节点,选择“添加库”。

    选择“外部库”,然后添加“库的路径”。



完成这一步,就可以将外部库添加到工程中。事实上,它会在host.pro中添加以下代码:

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../build-Library-Desktop_Qt_5_4_1_MSVC2013_32bit-Debug/release/ -lLibrary
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../build-Library-Desktop_Qt_5_4_1_MSVC2013_32bit-Debug/debug/ -lLibrary
else:unix: LIBS += -L$$PWD/../build-Library-Desktop_Qt_5_4_1_MSVC2013_32bit-Debug/ -lLibrary

INCLUDEPATH += $$PWD/../build-Library-Desktop_Qt_5_4_1_MSVC2013_32bit-Debug/debug
DEPENDPATH += $$PWD/../build-Library-Desktop_Qt_5_4_1_MSVC2013_32bit-Debug/debug

3,添加测试代码

    在MainWindow的构造函数中定义类“Library”.

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "library.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    Library a;
}

MainWindow::~MainWindow()
{
    delete ui;
}

4,debug,将在控制台中看到之前添加的打印信息


四、补充

1,Qt中也可以使用QLibrary类和它的Load函数,动态加载外部库。

2,该实验使用的是MinGW编译器。

3,使用VC++编译器时,在加载库的时候,有编译错误。但是,如果你使用VC++编译器,可以直接用VS的方式加载外部库。

展开阅读全文

没有更多推荐了,返回首页