天天看點

qt 4.6.2 與visual studio 2005 內建(編譯方法,以及中間遇到的問題)

不知不覺在蒂森差不多半個月了,哈哈,時間過得很快,過得很充實,近來研究QT,首先嘛,肯定要學會安裝了,這最基礎的不會更不用說下面的啦。閑話少說,進正題,基本的安裝步驟網上多的是,但參考一個大多數情況是安裝不上的,總有這樣的那樣的問題,基本上我是參考了下面的步驟:

    Qt 4.6.2 雖然新增了LGPL協定,但這也阻礙了我們在VS中使用Qt。因為免費開源的版本隻提供了GCC編譯好的二進制庫,而沒有VC編 譯好的二進制庫,隻有商業版本才有VS編譯好的針對Windows的DLL,lib等二進制庫。

    再者,VC編譯器比GCC 還是要強勁很多,并且調試器異常強大。Qt Creator雖然很酷,目前還很粗糙。很多人也更為熟悉VS的界面。用VS編譯出二進制庫:

    1. 下載下傳并安裝 qt-sdk-win-opensource-2010.02.1.exe,安裝到預設的 c:\qt\2010.02.1。它包含了MingGW和 Qt Creator,以及預編譯好的二進制檔案(用GCC編譯的)。你可以直接使用Qt Creator 開始開發工作,不需要任何額外的配置。

    2. 将整個目錄 c:\qt\2010.02.1 拷貝一份到 c:\qt\4.6.2-vc。我們将會修改目錄c:\qt\4.6.2-vc,使用VC++來編譯出所需要的庫。這兩個目錄可以同時存在,Qt使用c:\qt\2010.02.1,Visual Studio 使用 c:\qt\4.6.2-vc。

    3. 修改 C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\下的 vsvars32.bat,在環境變量PATH中添加Qt的目錄,如 c:\qt\4.5.0-vc\qt,在INCLUDE 添 加上c:\qt\4.5.0-vc\qt\include , 在LIB添加 c:\qt\4.5.0-vc\qt\include, 如:

    @set PATH=C:\Qt\4.6.2-vc\qt;c:\Program Files\Microsoft Visual Studio 8\Common7\IDE;c:\Program Files\Microsoft Visual Studio 8\VC\BIN;c:\Program Files\Microsoft Visual Studio 8\Common7\Tools;c:\Windows\Microsoft.NET\Framework\v3.5;c:\Windows\Microsoft.NET\Framework\v2.0.50727;c:\Program Files\Microsoft Visual Studio 8\VC\VCPackages;%PATH%

    @set INCLUDE=C:\Qt\4.6.2-vc\qt\include;c:\Program Files\Microsoft Visual Studio 8\VC\ATLMFC\INCLUDE;c:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE;%INCLUDE%

    @set LIB=C:\Qt\4.6.2-vc\qt\lib;c:\Program Files\Microsoft Visual Studio 8\VC\ATLMFC\LIB;c:\Program Files\Microsoft Visual Studio 8\VC\LIB;%LIB%

打開一個cmd指令行視窗,把這個檔案拖過來執行,這樣,你打開的cmd就具有上面設定的環境變量了,但是這些變量隻針對你目前的cmd,不會更改本機配置,是以,不要關閉cmd視窗,你需要在這個CMD視窗中完成接下來的指令。

(原文是按照第三步來做的,第一次的時候我也是按這一步驟編譯,但由于出了後面的問題,便手動在系統環境變量的path中添加C:\Qt\qt-4.3.1\bin,注意,這裡應該對應安裝目錄,其實效果跟上面的是一樣的)

4. 執行

c:\> cd c:\qt\4.5.0-vc\qt

c:\qt\4.5.0-vc\qt> configure -platform win32-msvc2005

上面這行指令,你可以按自己的需要修改,但注意一定要指明 -platform 後的參數,指明想要配置成那個版本的VS。這一步要花點時間,大概60分鐘。

5. 輸入 nmake,回車,開始編譯。這一步跟漫長,我的大概編譯 了3個小時~~

    注意:如果你是Windows 7下,這裡多半會失敗,因為Win 7 SDK有Bug,在binary沒有resouce區域的時候mt程式是不能把manifest添加到binary中的(參考:http://download.microsoft.com/download/8/8/0/8808A472-6450-4723-9C87-977069714B27/ReleaseNotes.Htm),是以我們需要做一些修改才行,

第一步,在CMD下執行如下指令

c:\qt\4.6.2-vc\qt>echo.>hello.rc

c:\qt\4.6.2-vc\qt> rc.exe /r hello.rc

得到 c:\qt\4.6.2-vc\qt\hello.res 資 源檔案。

第二步,修改qmake配置檔案,使得Makefile的連結指令中會把hello.res一并連結到binary中。修改mkspecs\win32-msvc2005目錄下的qmake.conf檔案第52行為

QMAKE_LFLAGS = /NOLOGO C:\Qt\4.6.2-vc\qt\hello.res

這樣任何link指令都必然會連結hello.res檔案。

然後才能輸入nmake開始編譯。

6. 安裝官方的VS插件qt-vs-addin-1.0.0-beta.exe,

7. 啟動 Visual Studio,選擇菜單“Qt->Qt Options”,在” Qt Verions ”頁籤點選 “Add”,Version Name随便填,例如 “qt4.6.2-vc”,路徑則輸入 “C:\Qt\4.6.2-vc\qt”。(網上的資料有 說要建立環境變量QTDIR= C:\Qt\4.6.2-vc\qt,我個人認為是不必要的)。

8. 現在你的Visual Studio 完全具備了Qt的所有功能,建立一個Qt 工程編譯運作試一試!

(編譯好後,在VS下點選Debug-Debug without debuggine可以看見程式運作的效果,不過

如果直接到debug目錄下輕按兩下這個exe檔案,會提示找不到QtCore4d.dll,這時你需要把C:\Qt\4.5.0-vc\qt\bin加入到PATH環境變量,這目錄下還有QtCore4.dll,都是上面編譯出來的)。

不過你現在的環境是內建了LGPL版Qt的VS,跟商業版的還是有點不 同。例如Qt Desiner(資源設計器)不是嵌入到VS得,需要通過菜單“Qt->Launch Desiner”來執行(商業版直接輕按兩下.ui檔案就會啟動Qt Desiner)。不過這無關緊要,隻是多點幾下滑鼠而已。

點選“Qt->Launch Linguist”可以啟動Qt Linguist,它是一款本地化工具,也十分有用。

接着,遇到了如下問題:

qt 4.6.2 與visual studio 2005 內建(編譯方法,以及中間遇到的問題)
qt 4.6.2 與visual studio 2005 內建(編譯方法,以及中間遇到的問題)
代碼

正在建立庫 ..\..\..\..\lib\QtWebKitd4.lib 和對象 ..\..\..\..\lib\QtWebKitd4.e  
xp  
QNetworkReplyHandler.obj : error LNK2001: 無法解析的外部符号 "public: virtual st  
ruct QMetaObject const * __thiscall WebCore::FormDataIODevice::metaObject(void)c  
onst " (?metaObject@FormDataIODevice@WebCore@@UBEPBUQMetaObject@@XZ)  
QNetworkReplyHandler.obj : error LNK2001: 無法解析的外部符号 "public: virtual vo  
id * __thiscall WebCore::FormDataIODevice::qt_metacast(char const *)" (?qt_metac  
ast@FormDataIODevice@WebCore@@UAEPAXPBD@Z)  
QNetworkReplyHandler.obj : error LNK2001: 無法解析的外部符号 "public: virtual in  
t __thiscall WebCore::FormDataIODevice::qt_metacall(enum QMetaObject::Call,int,v  
oid * *)" (?qt_metacall@FormDataIODevice@WebCore@@UAEHW4Call@QMetaObject@@HPAPAX  
@Z)  
QNetworkReplyHandler.obj : error LNK2001: 無法解析的外部符号 "public: virtual st  
ruct QMetaObject const * __thiscall WebCore::QNetworkReplyHandler::metaObject(vo  
id)const " (?metaObject@QNetworkReplyHandler@WebCore@@UBEPBUQMetaObject@@XZ)  
QNetworkReplyHandler.obj : error LNK2001: 無法解析的外部符号 "public: virtual vo  
id * __thiscall WebCore::QNetworkReplyHandler::qt_metacast(char const *)" (?qt_m  
etacast@QNetworkReplyHandler@WebCore@@UAEPAXPBD@Z)  
QNetworkReplyHandler.obj : error LNK2001: 無法解析的外部符号 "public: virtual in  
t __thiscall WebCore::QNetworkReplyHandler::qt_metacall(enum QMetaObject::Call,i  
nt,void * *)" (?qt_metacall@QNetworkReplyHandler@WebCore@@UAEHW4Call@QMetaObject  
@@HPAPAX@Z)  
QNetworkReplyHandler.obj : error LNK2019: 無法解析的外部符号 "protected: void __  
thiscall WebCore::QNetworkReplyHandler::processQueuedItems(void)" (?processQueue  
dItems@QNetworkReplyHandler@WebCore@@IAEXXZ),該符号在函數 "public: void __thisc  
all WebCore::QNetworkReplyHandler::setLoadMode(enum WebCore::QNetworkReplyHandle  
r::LoadMode)" (?setLoadMode@QNetworkReplyHandler@WebCore@@QAEXW4LoadMode@12@@Z)  
中被引用  
FrameLoaderClientQt.obj : error LNK2019: 無法解析的外部符号 "protected: void __t  
hiscall QWebPage::unsupportedContent(class QNetworkReply *)" (?unsupportedConten  
t@QWebPage@@IAEXPAVQNetworkReply@@@Z),該符号在函數 "public: virtual void __this  
call WebCore::FrameLoaderClientQt::download(class WebCore::ResourceHandle *,stru  
ct WebCore::ResourceRequest const &,struct WebCore::ResourceRequest const &,clas  
s WebCore::ResourceResponse const &)" (?download@FrameLoaderClientQt@WebCore@@UA  
EXPAVResourceHandle@2@ABUResourceRequest@2@1ABVResourceResponse@2@@Z) 中被引用  
FrameLoaderClientQt.obj : error LNK2019: 無法解析的外部符号 "protected: void __t  
hiscall QWebPage::downloadRequested(class QNetworkRequest const &)" (?downloadRe  
quested@QWebPage@@IAEXABVQNetworkRequest@@@Z),該符号在函數 "public: virtual voi  
d __thiscall WebCore::FrameLoaderClientQt::startDownload(struct WebCore::Resourc  
eRequest const &)" (?startDownload@FrameLoaderClientQt@WebCore@@UAEXABUResourceR  
equest@2@@Z) 中被引用  
..\..\..\..\lib\QtWebKitd4.dll : fatal error LNK1120: 9 個無法解析的外部指令  
NMAKE : fatal error U1077: “"C:\Program Files\Microsoft Visual Studio 8\VC\BIN\  
link.EXE"”: 傳回代碼“0x460”  
Stop.  
NMAKE : fatal error U1077: “"C:\Program Files\Microsoft Visual Studio 8\VC\BIN\  
nmake.exe"”: 傳回代碼“0x2”  
Stop.  
NMAKE : fatal error U1077: “cd”: 傳回代碼“0x2”  
Stop.       
qt 4.6.2 與visual studio 2005 內建(編譯方法,以及中間遇到的問題)

 解決方法:删除QT目錄下的mocinclude.tmp檔案,大緻路徑如下:src/3rdparty/webkit/WebCore/tmp/moc/{debug,release}_shared/mocinclude.tmp,再nmake一次,之後又出現了如下錯誤:

qt 4.6.2 與visual studio 2005 內建(編譯方法,以及中間遇到的問題)
qt 4.6.2 與visual studio 2005 內建(編譯方法,以及中間遇到的問題)
api\qscriptextensionplugin.h(43): Error: Undefined interface  
NMAKE : fatal error U1077: “C:\Qt\4.6.2-vc\qt\bin\moc.exe”: 傳回代碼“0x1”  
Stop.  
NMAKE : fatal error U1077: “"C:\Program Files\Microsoft Visual Studio 8\VC\BIN\  
nmake.exe"”: 傳回代碼“0x2”  
Stop.  
NMAKE : fatal error U1077: “cd”: 傳回代碼“0x2”  
Stop.        
qt 4.6.2 與visual studio 2005 內建(編譯方法,以及中間遇到的問題)

 解決方法是将:qt/src/script/tmp/moc/debug_shared/mocinclude.tmp、

 qt/src/script/tmp/moc/release_shared/mocinclude.tmp删除,然後繼續編譯就ok了。 

http://www.cnblogs.com/bingcaihuang/archive/2010/12/02/1894005.html