Qt5 未解析的外部静态元对象函数

Qt5 unresolved external to staticMetaObject function

本文关键字:静态 对象 函数 外部 Qt5      更新时间:2023-10-16

我有一个从QObjectQRunnable派生的类,并且还具有Q_OBJECT宏。包含该类的库编译良好,我得到了一个.lib.dll文件。我使用的是 MSVC 2013 和 QT 5.4(来自 qt.io 的预编译二进制文件)。

使用依赖沃克查看 DLL,我可以看到该函数在那里。文件被moc'ed,这意味着我可以查看生成的CPP文件。作为证明,这是导致麻烦的功能。

const QMetaObject DHImageConvHandler::staticMetaObject = {
    { &QObject::staticMetaObject, qt_meta_stringdata_DHImageConvHandler.data,
      qt_meta_data_DHImageConvHandler,  qt_static_metacall, Q_NULLPTR, Q_NULLPTR}
};

现在,当我尝试创建链接到此库的应用程序时,出现以下错误。

unresolved external symbol "public: static struct QMetaObject const DHImageConvHandler::staticMetaObject" (?staticMetaObject@DHImageConvHandler@@2UQMetaObject@@B) 
referenced in function "public: static class QString __cdecl DHImageConvHandler::tr(char const *,char const *,int)" (?tr@DHImageConvHandler@@SA?AVQString@@PBD0H@Z)

将库的项目类型从"动态库"更改为"静态库"会使这种情况消失,但我很好奇为什么。代码在库中。我用文本编辑器打开了导入库并查找了staticMetaObject,如前所述,Dependency Walker也显示它在那里。

谁能对此有所了解?

编辑 10.01.2015我错误地说了谁在使用有问题的图书馆。该库链接到另一个库,该库随后是应用程序的一部分。

感谢阿奇为我指出正确的方向。dllimport/dllexport 前缀是代码的一部分 - 等待它 - 每个库都使用相同的宏和预处理器指令。这意味着,当我的问题库被另一个库的代码使用时,并且两者都使用相同的宏来导出它们的符号,第二个库包括第一个库的标头,使用 dllexport 而不是 dllimport。一旦我给我的问题库它自己的dllexport/dllimport宏,一切正常。