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.

mocQT 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

そしてそれは同じエラーを返しました。いくつかのフラグを 1 つずつ削除してみて、 に絞り込みました-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 ヘッダーによって公開されたモック バグである可能性が最も高いです。同様に失敗するため、ソースからQtを再コンパイルしなかったに違いありません。

Visual Studio 11 はQt ではサポートされていません。Tier2のサポートにもありません。回避策は、バグが修正されるまで MSVC 2010 を使用するか、moc を修正してパッチを送信することです:)

于 2012-06-16T16:44:19.057 に答える
1

同様のエラーが発生していましたが、Visual Studio 12 と Qt は Qt から直接でした。したがって、クバ・オーバーの答えはうまくいきませんでした。

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

以下に示すように、Qtヘッダーへの参照をQ_MOC_RUNで(ではなく)囲むことでうまくいきました。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 に答える