在需要创建动态链接库时,通常有类似如下的条件编译:
#if defined(SYS_LIBRARY) //动态库导出定义
# define SYSSHARED_EXPORT Q_DECL_EXPORT
#else
# define SYSSHARED_EXPORT Q_DECL_IMPORT
#endif
其 pro 文件中会定义 DEFINES += SYS_LIBRARY
在头文件中需要导出的类或函数声明前面加上 SYSSHARED_EXPORT
SYSSHARED_EXPORT quint32 qSizeOf(quint8 byDataType); //根据E_DATA_TYPE枚举定义的数据类型获取数据长度
在源文件的对应函数前也有SYSSHARED_EXPORT
SYSSHARED_EXPORT quint32 qSizeOf(quint8 byDataType) //根据数据类型获取数据长度
{
switch(byDataType)
{
case DATA_TYPE_BOOL:
return sizeof(bool);
break;
case DATA_TYPE_UINT8:
return sizeof(quint8);
break;
case DATA_TYPE_INT8:
return sizeof(qint8);
break;
case DATA_TYPE_UINT16:
return sizeof(quint16);
break;
case DATA_TYPE_INT16:
return sizeof(qint16);
break;
case DATA_TYPE_UINT32:
return sizeof(quint32);
break;
case DATA_TYPE_INT32:
return sizeof(qint32);
break;
case DATA_TYPE_UINT64:
return sizeof(quint64);
break;
case DATA_TYPE_INT64:
return sizeof(qint64);
break;
case DATA_TYPE_FLOAT:
return sizeof(float);
break;
case DATA_TYPE_DOUBLE:
return sizeof(double);
break;
case DATA_TYPE_DATETIME:
case DATA_TYPE_DATE:
case DATA_TYPE_TIME:
return sizeof(S_DateTime);
break;
case DATA_TYPE_BINARY:
return 65536; //TODO:
break;
case DATA_TYPE_STRING:
return SIZE_NAME;
break;
case DATA_TYPE_PASSWORD:
return SIZE_PASSWORD;
break;
case DATA_TYPE_IP4:
return SIZE_IP4;
break;
case DATA_TYPE_IP6:
return SIZE_IP6;
break;
case DATA_TYPE_PHONENUMBER:
return SIZE_PHONENUMBER;
break;
case DATA_TYPE_SN:
return SIZE_SN;
break;
case DATA_TYPE_COLOR:
return sizeof(quint32);
break;
default:
break;
}
return 0;
}
然后,在另一个应用程序中的pro文件中LIBS、INCLUDEPATH加入依赖动态库。
试问,在这整个过程中,SYSSHARED_EXPORT 什么时候是Q_DECL_EXPORT,什么时候是Q_DECL_IMPORT?