一.概述
~~ 最近项目需要,需要将部分自己写的控件组件化,要求要将部分自己写的控件封装成动态库。于是,网上学习了一下,幸不辱命,成功生成了动态库,并且可以被调用。下图的仪表是我想封装成库的类:
~~ win 下动态链接库的后缀为 xxx.dll, 静态库为 libxxx.a
二.动态库生成
1.新建一个C++库工程
2.类型选择 共享库
3.根据需要勾选要选择的模块,由于我要用到QWidget,所以将“QtWidgets”选项选上。
4.一直下一步,直到完成,此时,项目文件是这样的
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.点击编译按钮,编译工程,弹出如下对话框,则编译成功,会在构建路径下生成了动态库和静态库。
5.这里成功生成了库文件。但是距离我的仪表类的代码还没有合并过去。
在工程中重新新建一个名为 MyDial 的qt 设计师界面,覆盖掉原来的myDial.cpp和myDial.h。
并且,修改myDial.h,在类的构造函数 定义前加上 宏 MYDIALSHARED_EXPORT
如下:
使用这种覆盖掉原来文件的方式新建文件,需要同步修改.pro工程文件(Qt有点傻),删掉重复包含的文件
然后将仪表类的代码合入mydial.cpp 、mydial.h 、mydial.ui
6.重新编译动态库。
二.调用动态库
调用动态库必要条件:定义动态库的头文件 和 动态库文件
步骤:
1.新建一个普通的qt界面工程。
2.工程文件中添加 库的寻找路径 。
3.我在工程目录内新建一个“include”文件夹,并将动态库的头文件放到里面。
4.在工程中添加动态库头文件。
5.在要调用的地方包含动态库头文件,然后就可以调用库的内容啦。
调用库中的内容:
运行实际效果图: