staticMetaObject 函数外部的 Qt5 未解析

Qt5 unresolved external to staticMetaObject function

我有一个从 QObjectQRunnable 派生的 class,还有 Q_OBJECT 宏。包含 class 的库编译正常,我得到一个 .lib.dll 文件。我正在使用 MSVC 2013 和 QT 5.4(来自 qt.io 的预编译二进制文件)。

使用 Dependency Walker 查看 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)

将库的项目类型从 "Dynamic Library" 更改为 "Static Library" 可以解决这个问题,但我很好奇为什么。代码在库中。我用文本编辑器打开导入库并查找 staticMetaObject,如前所述,Dependency Walker 也显示它在那里。

任何人都可以阐明这一点吗?

编辑 10.01.2015 我说错了谁在使用相关图书馆。该库链接到另一个库,后者是应用程序的一部分。

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