2012-06-16 45 views
2

我試圖建立在Qt Creator的一個QT項目,但得到的鏈接錯誤:QT moc.exe產生空文件,錯誤涉及type_traits

minecraftlauncher.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __cdecl Launcher::MinecraftLauncher::metaObject(void)const " ([email protected]@[email protected]@[email protected]@XZ) 
minecraftlauncher.obj : error LNK2001: unresolved external symbol "public: virtual void * __cdecl Launcher::MinecraftLauncher::qt_metacast(char const *)" ([email protected]@[email protected]@[email protected]) 
minecraftlauncher.obj : error LNK2001: unresolved external symbol "public: virtual int __cdecl Launcher::MinecraftLauncher::qt_metacall(enum QMetaObject::Call,int,void * *)" ([email protected]@[email protected]@[email protected]@@[email protected]) 
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. 

我試圖在與它在Qt Creator中已經運行帶有標誌的命令行中運行moc錯誤消息:

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 
+0

你能告訴我們你的'minecraftlauncher.hpp'文件? – leemes

+0

https://gist.github.com/2941696 –

回答

1

這很可能是由C++ 11頭露出的MOC錯誤。我敢打賭,你沒有從源頭重新編譯Qt,因爲那樣也會失敗。

的Visual Studio 11是not supported by Qt。它甚至不支持tier2。解決方法是使用2010 MSVC直到錯誤是固定的,或者爲你解決交通部提交補丁:)

+0

但是,當我不加精STDLIB MOC作品包括文件夾包含路徑或當我重新命名type_traits,它仍然返回相同的錯誤,當我做一個補充插槽,就像[this](https://gist.github.com/2942068) –

+0

實際上,我從源代碼編譯Qt,因爲我想與Java接口並希望使用64位Java,而且當我嘗試使用64位Java時首先編譯它,但由於某種原因,當我重新載入重新編譯的源代碼時,它的工作原理是:/我會嘗試使用VS 2010,不過我只有快速編譯版本,這會使x64>>變得複雜。 –