1. 程式人生 > >親測 vs2010 + qt-opensource-windows-x86-vs2010-4.8.6 純靜態庫編譯

親測 vs2010 + qt-opensource-windows-x86-vs2010-4.8.6 純靜態庫編譯

具體參見http://www.cnblogs.com/elect-fans/archive/2012/03/29/2422816.html

但是在開頭的地方有兩點感覺不太對:

1.     configure -debug-and-release -fast -static -platform win32-msvc2010 -no-qt3support -script -scripttools -qt-zlib -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg -qt-sql-sqlite -plugin-sql-sqlite -qt-style-windows -qt-style-windowsxp -qt-style-windowsvista -qt-style-plastique -qt-style-cleanlooks -qt-style-motif -qt-style-cde -nomake demos -nomake examples -nomake docs –mp


應該把最後的-mp去掉

2.  QMAKE_CFLAGS_RELEASE,QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO,QMAKE_CFLAGS_DEBUG這3處後面的MD,MDd對應改成MT,MTD, 

感覺應該是這樣:MD,MDd對應改成MT,MTd,應為在編譯的過程中有警告:忽略未知選項MTD

但是在寫Qt程式設計的時候也沒遇到什麼錯誤 這個就沒試,所以不確定。

我的配置後拿到別人電腦上還會出現亂碼,解決如下:

QTextCodec *codec = QTextCodec::codecForName("System");//utf-8   gbk 均不行。。
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);

教程如下:

 下載原始碼,注意一定是原始碼壓縮包如qt-everywhere-opensource-src-4.8.0.zip,不是Qt釋出的已編譯的不同版本的標準庫如qt-win-opensource-4.8.0-vs2010.exe,這些版本都只是動態編譯的,不是我們所需要的。只有用原始碼包才能做真正的純靜態編譯,如果用Qt官網已編譯的標準庫.exe檔案進行編譯,有可能出現各種錯誤,而且編譯後的檔案巨大,我當時就在這裡繞了很大的彎子,請童鞋們注意啦!!可能有些老鳥會笑話,但我本著最嚴肅的態度告訴菜鳥們,上網查資料看部落格,一定要注意博文的文字細節,有時候差幾個字就能讓你費很大的勁,四處碰壁。

首先解壓原始碼包到你想要儲存編譯的位置,注意檔案目錄一定不能包含中文和空格

      由於Qt4.8在VS環境下的一些問題,為了避免編譯中途出現,我總結了3個地方需要修改。

(1) 刪除原始碼包中bin目錄下的syncqt和syncqt.dat檔案,如你不放心可將其改名或剪下到別的位置。如不修改將發生 Perl not found in environment - cannot run syncqt 錯誤。

(2) 修改\mkspecs\win32-msvc2010下的qmake.conf檔案,將其中的
QMAKE_CFLAGS=-nologo -Zm200 -Zc:wchar_t-改成QMAKE_CFLAGS=-nologo -Zm200 -Zc:wchar_t
注意末尾的”-“號區別。如不修改將來如有專案使用wchar_t,qt卻編譯成wchar_t-,編譯會導致連線錯誤,提示找不到Qwstring;
QMAKE_CFLAGS_RELEASE,QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO,QMAKE_CFLAGS_DEBUG這3處後面的MD,MDd對應改成MT,MTD,以實現在沒有VC庫的電腦也能執行Qt程式。

(3) 修改src\3rdparty\webkit\Source\WebCore\platform下的DefaultLocalizationStrategy.cpp,定位到327行,將本行替換成return WEB_UI_STRING("Look Up \"<selection>\"", "Look Up context menu item with selected word").replace("<selection>", truncatedStringForLookupMenuItem(selectedString));(由於word自動排版問題,請各位直接將以上英文部分一次性全複製,其實它們是一行,不要分行復制)。
如不修改將出現編譯Webkit 時會出現 U1077錯誤。

      VS2010下純靜態編譯,需要再VS2010的命令提示符下進行,我安裝的是中文版visual studio2010,我的開啟步驟如下(英文版自己對號入座):開始->Microsoft Visual Studio 2010->Visual Studio Tools->Visual Studio 命令提示(2010),開啟的視窗如下:

clip_image002

      上圖是VS2010自動幫我配置好環境變數,已正常進入VS2010的VC目錄。我當初碰到過一次自動配置環境變數錯誤,在截圖的第二行出現一行英文,內容大概是無法確定VC環境以及VC的位置,當時查遍了各種資料以及嘗試網上的各種辦法,中文的外文的網站各種建議,都不可以,差點讓我失去信心。當時一生氣,重啟電腦,出門走走又自己琢磨了好幾種方法,回來剛想試一試,沒想到重新開啟命令提示符,居然又自動可以了,真是驚喜啊。。最後想了想,當時錯誤可能是先裝了SDK,然後又胡亂根據網上的方法,手動修改了電腦的環境變數,然後就出現這個問題。。後來再重啟電腦前,把之前手動新增的環境變數統統刪了,重啟後重開命令提示符就恢復了。希望對有和我相同問題的童鞋能有所幫助。

上一段是題外話,如果你的VS已經自動幫你配置好環境變量了,如上面截圖所示,則輸入命令進入到原始碼包的目錄下。這裡教一些命令列新手,老鳥請直接跳過,如你現在的目錄在C盤下,而你的原始碼包在D盤,則輸入”d:”,回車,進入到D盤。可以使用cd進入你所要進入的目錄中,如cd Qt\4.8.0,就能進入到D:\Qt\4.8.0中,在各個目錄下,可以使用dir命令檢視當前目錄下的所有檔案,如同Linux下的ls命令。我進入我的已解壓的原始碼包目錄下,我已重新命名為4.8.0了。命令提示符截圖如下:

clip_image004

     接下來進行編譯前的配置工作。執行配置,完整命令如下:

configure -debug-and-release -fast -static -platform win32-msvc2010 -no-qt3support -script -scripttools -qt-zlib -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg -qt-sql-sqlite -plugin-sql-sqlite -qt-style-windows -qt-style-windowsxp -qt-style-windowsvista -qt-style-plastique -qt-style-cleanlooks -qt-style-motif -qt-style-cde -nomake demos -nomake examples -nomake docs –mp

推薦將debug和release版本都編譯,那樣VS2010編譯除錯Qt程式不會出現LINK錯誤,本人親測,有些人說只要編譯release就可以了,但我個人覺得多編譯一個debug,就增加一點點空間,而且後面命令省掉了demos等檔案的編譯,我最終編譯完成的檔案也就3.6G,對於現在的電腦硬碟來說都是毛毛雨了。命令最後的-nomake demos -nomake examples -nomake docs,不變異demos,exampls,docs檔案,這樣既可以提高編譯速度,也能減小編譯後的體積。-mp適合多核使用者提高編譯速度,-fast也很重要,細節請看上面的博文。

執行配置,期間會詢問是否採用open source(開源版本),還是商業版本,輸入”o”選擇開源版本;詢問是否同意條款,輸入”y”表示同意,開始執行配置過程,直到提示配置完成,可以下一步nmake,以開始執行編譯。

      輸入nmake,執行編譯,編譯過程數個小時(具體看個人電腦配置),編譯時最好關閉防火牆,360之類的,你可以做別的事情了,看看網頁,電影之類的,但不要執行大型程式,不然會嚴重降低編譯速度。

clip_image006

     編譯成功結束,如同上圖所示,可以關閉命令提示符了。我之前在看網上的資料,執行nmake clean,nmake confclean,結果造成後面VS2010編譯Qt程式以及QtSDK編譯程式出現各種問題,如找不到config.h,qtmaind.lib等等。所以強烈建議,編譯成功就到此結束,不要執行上述兩個清理工作。之前還嘗試在configure新增-prex 指定nmake install安裝目錄,後經實驗,編譯後,的確可以實現編譯完成後能實現靜態庫連結,且在QtCreator編譯出靜態程式,但是在VS2010編譯程式時,出現很多找不到PDB的警告,所以捨棄之。

      接下來安裝VS外掛,安裝檔案為qt-vs-addin-1.1.10.exe,以下是安裝過程以及安裝的選項。

clip_image007

clip_image008

安裝完成後,開啟VS2010,可以通過QT選單進行QT編譯庫定位以及開啟pro工程檔案,也可以通過新建工程專案來建立QT工程。

clip_image010

clip_image011

clip_image013

      開啟QT工程後,稍稍等待左下角提示關聯檔案包含提示結束,出現“就緒”的提示後,即可像編譯普通VC程式一樣,點“編譯”按鍵進行編譯以及通過除錯選單進行除錯。注意通過VS2010主要用於除錯,要想釋出最終的靜態連結程式,最好通過QTSDK中的QTCreator來發布。

      安裝QtSDK,以下是安裝過程以及安裝選項:

clip_image014

clip_image015

clip_image016

       安裝完成後,開啟QtCreator中,在選單”工具”->”選項”->”構建和執行”->”Qt版本”,手動新增剛才靜態編譯的QT的qmake.exe工具。

clip_image018

clip_image020

          配置完成,接下來就可以開啟Qt工程,通過專案設定來發布靜態連結的Qt程式咯!!

我經過4天N次嘗試,親自測試各種資料和方法,最終通過實踐成功完成了VS2010靜態編譯配置QT,期間遇到種種問題,總算解決了,由於篇幅的原因就不一一陳述了,不過本文是我一步步整理出來的,不敢說最適合,但一定有效!