2

我试图在 QT Creator 中构建一个 QT 项目,但出现链接错误:

minecraftlauncher.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __cdecl Launcher::MinecraftLauncher::metaObject(void)const " (?metaObject@MinecraftLauncher@Launcher@@UEBAPEBUQMetaObject@@XZ)
minecraftlauncher.obj : error LNK2001: unresolved external symbol "public: virtual void * __cdecl Launcher::MinecraftLauncher::qt_metacast(char const *)" (?qt_metacast@MinecraftLauncher@Launcher@@UEAAPEAXPEBD@Z)
minecraftlauncher.obj : error LNK2001: unresolved external symbol "public: virtual int __cdecl Launcher::MinecraftLauncher::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@MinecraftLauncher@Launcher@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z)
debug\Launcher.exe : fatal error LNK1120: 3 unresolved externals

由于某种原因,moc.exe元对象编译器正在创建空 moc_*.cpp 文件,并显示错误消息

:/Program Files (x86)/Microsoft Visual Studio 11.0/VC/include/type_trait(0): Note: No relevant classes found. No output generated.

我尝试moc使用在 QT Creator 中运行的标志在命令行上运行:

C:\QtSDK\x64\bin\moc.exe -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"c:\QtSDK\x64\include\QtCore" -I"c:\QtSDK\x64\include\QtGui" -I"c:\QtSDK\x64\include" -I"c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include" -I"c:\QtSDK\x64\include\ActiveQt" -I"debug" -I"..\Launcher" -I"." -I"c:\QtSDK\x64\mkspecs\win32-msvc2005" -D_MSC_VER=1400 -DWIN32 ..\Launcher\minecraftlauncher.hpp -o debug\moc_minecraftlauncher.cpp

它返回了同样的错误。我尝试一一删除几个标志,并将其缩小到-I"c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include". 出于某种原因,当该目录位于包含路径上时,会显示“未找到相关类”错误并生成一个空的 .cpp 文件。但是,当该目录不在包含路径上时, moc.exe 可以正常工作。

由于错误消息包括:/Program Files (x86)/Microsoft Visual Studio 11.0/VC/include/type_trait(0),我尝试type_traits在该位置重命名文件,以便无法识别它。当我这样做时, moc.exe 再次正常工作(但实际上失败了,因为 type_traits 包含在我包含的标准库文件中的某处)。所以错误是在 type_traits 的某个地方引起的

据我所知type_traits,我相信它与获取有关对象的编译类型信息有关。但我不知道为什么它会导致元对象编译器出错。为什么要这样做?moc 对 type_traits 做了什么,为什么会这样,什么是失败的?

我将非常感谢任何人可以提供的任何见解,因为这对我来说非常令人费解。

minecraftlauncher.hpp文件:

#ifndef MINECRAFTLAUNCHER_HPP
#define MINECRAFTLAUNCHER_HPP

#include <QMainWindow>
namespace Launcher {
    class MinecraftLauncher : public QMainWindow
    {
        Q_OBJECT

    public:
        explicit MinecraftLauncher(QWidget *parent = 0);
        ~MinecraftLauncher();

    private:

    };
}

#endif // MINECRAFTLAUNCHER_HPP
4

2 回答 2

1

这很可能是 C++11 标头暴露的 moc 错误。我敢打赌,您没有从源代码重新编译 Qt,因为这同样会失败。

Qt 不支持Visual Studio 11 。它甚至不在 tier2 支持中。解决方法是在错误修复之前使用 MSVC 2010,或者让您修复 moc 并提交补丁 :)

于 2012-06-16T16:44:19.057 回答
1

我遇到了类似的错误,但使用 Visual Studio 12 并且 Qt 直接来自 Qt。所以 Kuba Ober 的回答没有用。

:/Program Files (x86)/Microsoft Visual Studio
12.0/VC/include/type_trait(0): Note: No relevant classes found. No output generated.

起作用的是用(不是)Q_MOC_RUN 包围对 Qt 标头的引用,如下所示。使用 Daniel Mulcahy 代码的顶部...

#ifndef MINECRAFTLAUNCHER_HPP
#define MINECRAFTLAUNCHER_HPP

#ifndef Q_MOC_RUN
#  include <QMainWindow>
#endif //Q_MOC_RUN

namespace Launcher {
class MinecraftLauncher : public QMainWindow
{
    Q_OBJECT
...
于 2018-12-29T21:00:23.500 回答