Qt5在staticMetaObject函数外部未解析

时间:2015-01-09 13:32:44

标签: c++ qt

我有一个派生自QObjectQRunnable并且还有Q_OBJECT宏的课程。包含该类的库编译得很好,我得到一个.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)

从"动态库"更改库的项目类型到"静态图书馆"让它消失,但我很好奇为什么。代码在lib中。我用文本编辑器打开导入库并查找staticMetaObject,并且如前所述,Dependency Walker也显示它在那里。

任何人都可以对此有所了解吗?

编辑10.01.2015 我想知道谁在使用有问题的图书馆。该lib链接到另一个lib,然后是app的一部分。

1 个答案:

答案 0 :(得分:5)

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