I、此时新的DynamicLib.h文件内容如下:
II、需要将其修改为下面的内容:
需要添加头文件#include "dynamiclib_global.h"
以及 在类名前添加 DYNAMICLIBSHARED_EXPORT
语句。
III、DYNAMICLIBSHARED_EXPORT
语句可以在头文件 dynamiclib_global.h
中直接复制过来,就是下方代码中,红色框圈出来的部分:
dynamiclib_global.h
也一定要带上
此时,动态库封装就已经算完成了,需要用到的文件也就是上面标记出来的四个。
DynamicLib.h
和dynamiclib_global.h
文件放到include
文件夹中DynamicLib.lib
放到lib
文件夹中INCLUDEPATH += $$PWD/include
LIBS += -L$$PWD/lib -lDynamicLib
其中指出了动态库需要的头文件路径,动态库的所在路径,以及动态库名字。$$PWD表示工程目录,-l后面表示库文件的名字,不包含后缀.lib。
然后在使用动态库的文件中添加需要使用的头文件,进行使用。
添加一个StackedWidget组件,第一页上面放一个按钮,点击这个按钮,跳转到第二页,第二页放置封装的动态库界面。
DynamicLib.dll
文件放到LibTest.exe
同级的文件夹下,否则程序运行时找不到动态库,程序就会崩溃由于此时是debug阶段,LibTest.exe文件在debug文件夹下,因此将dll放到这里:
同理,当release打包之后,dll依然放到exe文件的同级目录中即可。
程序便启动成功了:
可以看到下面打印了 Dynamic Link Lib Test!!!
字符串,说明动态库可以正常调用。
假如现在有一个名为CustomMessageBox的GUI进程,想要将其改为DLL,需要做如下修改(注意红色部分为类名的大写,需要根据实际情况修改红色文本部分的内容。):
1 #TEMPLATE = app
2
3 DEFINES += CUSTOMMESSAGEBOX_LIBRARY
4 TEMPLATE = lib
1 #if defined(CUSTOMMESSAGEBOX_LIBRARY)
2 # define CUSTOMMESSAGEBOXSHARED_EXPORT Q_DECL_EXPORT
3 #else
4 # define CUSTOMMESSAGEBOXSHARED_EXPORT Q_DECL_IMPORT
5 #endif
1 //class CustomMessageBox : public QDialog
2 class CUSTOMMESSAGEBOXSHARED_EXPORT CustomMessageBox : public QDialog
若是 MinGW32
编译器,在编译之后会在文件夹下找到 ***.dll
和 ***.a
文件;若是 MSVC
编译器,则应该是 ***.dll
和 ***.lib
。
在使用该库的程序中,新建一个 include
文件夹,将 ***.a
文件 和 导出类的头文件
复制进这个文件夹,在程序中引入该头文件即可。在编译之后,将不同模式编译下的 dll
文件放入程序编译后的文件夹中,才能正常运行程序。