Qt开发之通过配置.pro文件封装动态链接库(dll)

1,008 阅读6分钟

这两天在实现将类封装成动态链接库的过程中遇到了很多问题,在此记录一下如何利用.pro文件和.pri文件管理我们的项目,并实现、使用动态链接库(DLL)。

这是项目的结构树:
在这里插入图片描述
工程名为tableViewSocket,其中,项目的MVC放在tableView这个子工程中,TCP通讯功能放在Network中,Network被封装成动态链接库。以下是如何将这样一个结构的工程通过.pro和.pri构建出来的步骤。

一、创建一个空的工程

在这里插入图片描述
填好工程名和工程路径,Next到底。

在这里插入图片描述
Qt在Test工程下自动生成了一个空的.pro文件。

P.S:
为了使工程最后生成的各种文件在组织上更有秩序,新建了App文件夹和Program文件夹。其中App文件夹用来存放.exe、.dll、.lib等文件,Program文件夹用来存放工程的源文件和头文件。

在这里插入图片描述
然后把Test.pro放到Program文件夹下,并创建MyView、MyLib两个文件夹。
在这里插入图片描述
从上面的结构树中可以看出tableView和Network都是作为tableViewSocket的子工程,所以下面靠手写.pro文件,将这两个文件夹与Test工程的关系建立起来。
在这里插入图片描述
P.S:在本地目录中,Test.pro与MyView、MyLib是同级的。

QT工程pro文件模板变量(TEMPLATE)说明:

模板变量告诉qmake为这个应用程序生成哪种makefile。下面是可供使用的选择:

  • app - 建立一个应用程序的makefile。这是默认值,所以如果模板没有被指定,这个将被使用。
  • lib - 建立一个库的makefile。
  • vcapp - 建立一个应用程序的Visual Studio项目文件。
  • vclib - 建立一个库的Visual Studio项目文件。
  • subdirs - 这是一个特殊的模板,它可以创建一个能够进入特定目录并且为一个项目文件生成makefile并且为它调用make的makefile。

SUBDIRS变量指定了子项的目录。但是保存并执行qmake之后,还是没有出现子目录,概要信息显示:在这里插入图片描述
意思找不到MyView和MyLib的.pro文件。所以还需要在这两个文件夹下面分别创建一个.pro文件。但是在Qt里面我们连这两个文件夹都看不到 - - ,只好到本地文件夹下面去找了。

创建的方法就是新建文本文档→重命名→改文件后缀为.pro。

在这里插入图片描述
重新打开工程,就可以看到这两个子工程了。
在这里插入图片描述

二、配置子目录中的.pro文件

app

首先,先配置MyView工程下的.pro文件。
在这里插入图片描述

  • TAMPLATE值为app,目的是为了最终建立一个可执行文件(.exe)。

  • TARGET用来指定目标文件的名称。默认情况下是包含的项目文件的基本名称。

  • QT用来引入指定的module,qmake会在帮你生成makefile的时候,设置好include path和lib path,在link时候设置好libs。而仅在源代码里 include 仅是引入声明,但是没有lib,所以链接时会出错。C++中编译和链接是分开的。头文件用于编译,确保整个工程程序语法结构无误。然后进行链接,将相关的库文件(已经编译好的库的源文件)插入到编译好的工程文件当中,这样即可运行。【转自:blog.csdn.net/W_J_CHELSEA…

  • DESTDIR用来指定存放该可执行文件的路径。

  • 在这里插入图片描述

说明:…/…/App意思是从当前MyView.pro所在的路径往上两级(Test文件夹)下的App文件夹

lib

下一步,配置MyLib工程下的.pro文件
在这里插入图片描述

三、配置.pri文件

在大型项目中,可以用.pri文件来管理工程的源文件和头文件,pri文件的创建一样可以通过在需要的路径下新建文本文档,再将后缀改为.pri。在这里插入图片描述
然后,在同名的.pro文件中,引入这个.pri文件。

保存后,在项目视图中自动生成了一个MyView文件夹和MyView.pri。
在这里插入图片描述
P.S:MyView.pro和MyView.pri在路径中是同级的,所以这边在MyView.pro中直接写include(MyView.pri)。

下一步,在MyView文件夹下创建include文件夹和src文件夹,分别用来存放头文件和源文件。

在这里插入图片描述
再在src文件夹下创建一个main.cpp文件,并在.pri中引入。
在这里插入图片描述
在这里插入图片描述
关闭并打开工程,就可以看到在MyView文件夹下自动生成一个Sources文件夹,src文件夹就包含在Sources中。
在这里插入图片描述
用同样的方法在MyLib中添加头文件和源文件。

步骤是先创建include文件夹和src文件夹,分别在里面用新建类的.h文件和.cpp文件,然后在.pri文件中引入。

在这里插入图片描述

四、导出库

MyLib是我们要作为动态链接库来使用的,还需要进行一个很关键的声明。

先在MyLib.pro文件中,添加如下代码,为后面的条件编译做准备:

DEFINES += MYLIB_LIBRARY	//这个名字要叫什么自己定

1

在之前建立的MyLib文件夹下创建一个同名的.h文件并在.pri中引入,或者直接在Qt项目视图中的include文件夹下通过Add New…来新建一个头文件。因为在视图中已经生成这个文件夹了,就可以不用那么麻烦,Qt会自动帮我们引入。

然后在文件中添加如下代码:

#ifndef MYLIB_H
#define MYLIB_H

#ifdef MYLIB_LIBRARY
# define MYLIB_LIBRARY_EXPORT Q_DECL_EXPORT
#else
# define MYLIB_LIBRARY_EXPORT Q_DECL_IMPORT
#endif

#endif // MYLIB_H

回到exportClass.h,添加如下代码,注意在类名前面添加MYLIB_LIBRARY_EXPORT,也就是之前在MyLib.h中定义过的宏。

#ifndef EXPORT_CLASS_H
#define EXPORT_CLASS_H
#include <QObject>
#include "MyLib.h"
class MYLIB_LIBRARY_EXPORT exportClass : public QObject{
    Q_OBJECT
public:
    exportClass(QObject *parent = Q_NULLPTR);
    ~exportClass();
};

#endif

注意:库中至少要有一个类是被导出的,否则构建的时候会报错。

再来到exportClass.cpp,这时候想要引入exportClass.h头文件没有出现自动提示,原来是在.pro文件中没有加入INCLUDEPATH,它用来指明应用程序所需的额外的包含路径的列表。回到.pro文件添加以下代码:

INCLUDEPATH += ./include

在这里插入图片描述
说明:在文件路径中,.pro与include文件夹是同级的,所以这么写是“当前目录下的include文件夹”的意思。

现在exportClass.h就有自动提示了。在exportClass.cpp中添加如下代码:

#include "exportClass.h"
#include "QDebug"
exportClass::exportClass(QObject *parent)
    :QObject(parent){
    qDebug()<<"i am called";
}
exportClass::~exportClass(){

}

五、引入库

引入同一工程下的库

现在,在MyView.pro文件中引入MyLib库。
在这里插入图片描述
然后在MyView文件夹下的main.cpp文件中引入exportClass.h,并定义一个exportClass对象。

#include <QApplication>
#include "exportClass.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    exportClass exp;

    return a.exec();
}

P.S:要引入<QApplication>需要在Test.pro中添加widgets模块。

运行项目,控制台中打印的结果说明成功调用了exportClass的构造函数。
在这里插入图片描述
在这里插入图片描述
同时,App文件夹下生成了MyLib.dll和MyLib.lib。

引入第三方库

生成MyLib.dll和MyLib.lib文件后,也可以将MyLib库作为第三方库添加到其它工程中,步骤如下:

1)将第三方库的.dll和.lib文件拷贝到当前工程的运行目录下(.exe文件所在的目录)

在这里插入图片描述
2)新建一个文件夹,将第三方库中所有的.h文件放进去在这里插入图片描述
3)对需要引用第三方库的工程的.pro文件进行配置
在这里插入图片描述
4)在需要调用第三方库导出类的地方,引入其导出类的.h文件
在这里插入图片描述
5)运行
在这里插入图片描述
【mark:www.cnblogs.com/lidabo/p/75…

关于.pro文件的配置还有很多知识需要慢慢补充,改日再更~

源码地址