前言
最近接触的项目中,按界面分工后采用动态库的方式交付给同事整合调用。开发环境为 Qt+VS
,刚开始接触 VS
有点扎心,特此记录。
Qt中动态库的创建
QtCreator
可以通过向导创建动态库,非常 amazing。
在本处示例的 testdll
中, 值得注意的是:
pro
//...
TEMPLATE = lib
DEFINES += TESTDLL_LIBRARY
testdll_global.h
#ifndef TESTDLL_GLOBAL_H
#define TESTDLL_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(TESTDLL_LIBRARY)
# define TESTDLLSHARED_EXPORT Q_DECL_EXPORT
#else
# define TESTDLLSHARED_EXPORT Q_DECL_IMPORT
#endif
#endif // TESTDLL_GLOBAL_H
testdll.h
#ifndef TESTDLL_H
#define TESTDLL_H
#include "testdll_global.h"
class TESTDLLSHARED_EXPORT Testdll
{
public:
Testdll();
};
#endif // TESTDLL_H
可以发现它主要是借助了宏定义去控制头文件中 class
的修饰符
- Q_DECL_EXPORT
即__declspec(dllexport)
,表示导出dll
- Q_DECL_IMPORT
即__declspec(dllimport)
,表示导入dll
Qt 界面类
采用向导,非常easy。
新建App;如果是编写界面类,一般基类选择QWidget
带界面的动态库
我们仅需要创建界面类,在头文件中加入宏定义
#if defined(__DLL_LIBRARY)
# define xxx_EXPORT __declspec(dllexport)
#else
# define xxx_EXPORT __declspec(dllimport)
#endif
并将 xxx_EXPORT
修饰于 class
值得注意的是 __DLL_LIBRARY
最好在 项目配置 中添加,避免打包时忘记修改导致编译错误:不允许 dllimport 静态数据成员 的定义。
在 Qt
中可在 pro文件
中添加:
DEFINES += __DLL_LIBRARY
在 VS
中则在此处添加:
测试程序
编译完成后需要将 *.h
、*.dll
、*.lib
一起打包。
QT
测试程序中可使用导入库文件向导:·
并在 UI界面 中创建一 QWidget
:
通过提升的方式调用:
若在 VS
中则需配置一下属性: