一.概述

~~ 最近项目需要,需要将部分自己写的控件组件化,要求要将部分自己写的控件封装成动态库。于是,网上学习了一下,幸不辱命,成功生成了动态库,并且可以被调用。下图的仪表是我想封装成库的类:

ANdroid9 编译动态库 编译成动态库_动态库


~~ win 下动态链接库的后缀为 xxx.dll, 静态库为 libxxx.a

二.动态库生成

1.新建一个C++库工程

ANdroid9 编译动态库 编译成动态库_头文件_02


2.类型选择 共享库

ANdroid9 编译动态库 编译成动态库_ANdroid9 编译动态库_03


3.根据需要勾选要选择的模块,由于我要用到QWidget,所以将“QtWidgets”选项选上。

ANdroid9 编译动态库 编译成动态库_#endif_04


4.一直下一步,直到完成,此时,项目文件是这样的

ANdroid9 编译动态库 编译成动态库_头文件_05


mydial.h

#ifndef MYDIAL_H
#define MYDIAL_H

#include "mydial_global.h"

class MYDIALSHARED_EXPORT MyDial
{

public:
    MyDial();
};

#endif // MYDIAL_H

mydial.cpp

#include "mydial.h"


MyDial::MyDial()
{
}

mydial_global.h

#ifndef MYDIAL_GLOBAL_H
#define MYDIAL_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(MYDIAL_LIBRARY)
#  define MYDIALSHARED_EXPORT Q_DECL_EXPORT
#else
#  define MYDIALSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // MYDIAL_GLOBAL_H

4.点击编译按钮,编译工程,弹出如下对话框,则编译成功,会在构建路径下生成了动态库和静态库。

ANdroid9 编译动态库 编译成动态库_ANdroid9 编译动态库_06


ANdroid9 编译动态库 编译成动态库_动态库_07


5.这里成功生成了库文件。但是距离我的仪表类的代码还没有合并过去。

在工程中重新新建一个名为 MyDial 的qt 设计师界面,覆盖掉原来的myDial.cpp和myDial.h。

并且,修改myDial.h,在类的构造函数 定义前加上 宏 MYDIALSHARED_EXPORT

如下:

ANdroid9 编译动态库 编译成动态库_#endif_08


使用这种覆盖掉原来文件的方式新建文件,需要同步修改.pro工程文件(Qt有点傻),删掉重复包含的文件

ANdroid9 编译动态库 编译成动态库_#endif_09


ANdroid9 编译动态库 编译成动态库_动态库_10


然后将仪表类的代码合入mydial.cpp 、mydial.h 、mydial.ui

6.重新编译动态库。

二.调用动态库

调用动态库必要条件:定义动态库的头文件动态库文件

步骤:

1.新建一个普通的qt界面工程。

2.工程文件中添加 库的寻找路径 。

3.我在工程目录内新建一个“include”文件夹,并将动态库的头文件放到里面。

4.在工程中添加动态库头文件。

5.在要调用的地方包含动态库头文件,然后就可以调用库的内容啦。

ANdroid9 编译动态库 编译成动态库_头文件_11


调用库中的内容:

ANdroid9 编译动态库 编译成动态库_ANdroid9 编译动态库_12


运行实际效果图:

ANdroid9 编译动态库 编译成动态库_ANdroid9 编译动态库_13