staticMetaObject 函数外部的 Qt5 未解析
Qt5 unresolved external to staticMetaObject function
我有一个从 QObject
和 QRunnable
派生的 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 宏,一切正常。
我有一个从 QObject
和 QRunnable
派生的 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 宏,一切正常。