之前因为一些原因,需要将一些widget派生类封装成dll,给其它项目使用。研究了一下,首先,该widget派生类需要与使用类尽量没有关联。(当明有一个共用类,保存各种全局变量,里面有一个变量,与语言选择相关的,共享类也包含了该头文件,可是并没有获取到全局变量的值)

一、新建工程

1. 新建Library\C++工程

2.选择共享库,设定路径

3.选择对应的模块,也可以在pro里面增加

二、工程介绍

1.本工程没有main函数,可以归类为库。

2.pro文件介绍

​ 需要debug版本的,手动增加

1
2
3
4
5
CONFIG+=debug_and_release
CONFIG(debug,debug|release){
unix:TARGET=$$join(TARGET,,,_debug)
else:TARGET=$$join(TARGET,,,d)
}

3.*_global.h介绍

​ 下图1为_global.h的内容,下图2为实际Q_DECL_EXPORTQ_DECL_IMPORT**的宏定义

4.主类或函数

​ 定义前加上PUBLICSHARED_EXPORT即可,然后做自己想做的控件。

1
2
3
4
5
6
7
PUBLICSHARED_EXPORT int max(int x,int y);  //尽量不要使用这些c++或者qt库中带有的函数名,万不得已经在使用前加:表明命名空间
类定义
class PUBLICSHARED_EXPORT Public
{
public:
Public();
};

5.编译完成

​ 在windows平台下,会成生一个.a文件和一个.dll(我使用的是Mingw5.5.1,MSVC会生成.lib和.dll)

三、库的使用

1.新建一个Application项目

​ 右击工程,添加库,选择内部库,在库文件中选择.a或者.lib。看图说话- -

2. pro文件会发生变化

INCLUDEPATH表示头文件的路径

DEPENDPATH表示编译时依赖文件的路径

​ 最好把 .h *_global.h .a .dll 放到与该工程下(该方法发布的时候需要把dll一起发布)

3.使用

​ 包含.h头文件即可以正常使用函数或者类。

4.注意

​ 有一个全局变量Language表示当前界面显示的语言,由程序开启后第一时间读取配置文件,供全局使用。使用了上面的方法,生成共享库的时候在头文件也包含了该类。结果在使用的时候经调试发现,两者的Language为两个互不关联的变量。即数据不共享,通过信号槽或者函数调用可以达到共享。