用CMAKE将工程组织为2个子模块,Main和ModuleA。ModuleA为动态链接库,将ModuleA中的类导出,代码如下:
#define Module_EXPORT __declspec(dllexport)
class Module_EXPORT XXXPackage : public QObject
{
Q_OBJECT
public:
XXXPackage(QString modelFilePath);
void saveTask();
private:
QString modelName;
QFileInfo modelFileInfo;
};
在Main模块中调用XXXPackage,如下:
#include <ModuleA.h>
int main()
{
QString modelFilePath = "xxx.STL";
XXXPackage package(modelFilePath);
package.saveTask();
return 0;
}
然后编译的时候硬是报错
无法解析的外部符号 "public: static struct QMetaObject const XXXPackage::staticMetaObject"
最后找到一篇帖子,原来是导出dll的宏不能写成固定的
#define Module_EXPORT __declspec(dllexport)
而应该是
#ifdef ModuleA_EXPORTS
#define Module_EXPORT __declspec(dllexport)
#else
#define Module_EXPORT __declspec(dllimport)
#endif
因为在main的头文件引用#include <MouduleA.h>,预编译展开后main.cpp中也是
/*这里还是dllexport*/
class __declspec(dllexport) XXXPackage : public QObject
{
}
/*正确应该是dllimport*/
class __declspec(dllimport) XXXPackage : public QObject
{
}
int main()
{
}