我有一个派生自QObject
和QRunnable
并且还有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的一部分。
答案 0 :(得分:5)
感谢Archie指出我正确的方向。 dllimport / dllexport前缀是代码的一部分 - 等待它 - 但每个库都使用相同的宏和预处理器指令。这意味着,当我的问题库被另一个库的代码使用,并且两个都使用相同的宏来导出它们的符号时,第二个库包含第一个库的头文件,其中包含dllexport而不是dllimport。一旦我给我的问题lib它自己的dllexport / dllimport宏一切正常。