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
そしてそれは同じエラーを返しました。いくつかのフラグを 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