詳解VS2010編譯Qt 4.7.2 靜態庫(測試成功)
詳解VS2010編譯Qt 4.7.2 靜態庫是本文要介紹的內容,從http://qt.nokia.com 下 載QT源代碼,注意是源代碼。我下載到的是QT4.7.2版,文件名為qt-win-opensource-src-4.7.2.zip 解壓,注意不要解壓路徑不要含有空格或中文(對于某些系統中用戶名是中文的情況,在參考的第3個文章中有解決辦法,如下面),我把它解壓到了D:\SDK\Qt_4_7_2_VS2010里 ***目錄如下:
- D:\SDK\Qt_4_7_2_VS2010\qt-everywhere-opensource-src-4.7.2\
準備一個存放編譯后“成品”的文件夾,我準備放在D:\SDK\Qt_4_7_2_VS2010\static里
用記事本或其它編輯器打開D:\SDK\Qt_4_7_2_VS2010\qt-everywhere-opensource-src-4.7.2\mkspecs\win32-msvc2010\qmake.conf(注 意VC版本號),按需要修改(修改部分參考文章1,文章1中提到了修改3個內容,但是自己做的時候沒有完全按照文章1來),文章1修改部分如下:
如果不希望編譯出來的DLL或EXE鏈接到VC運行時庫,就把-MD改成-MT,把-MDd改成-MTd(查找替換)。
[可選]如 果做了上一步,那么就不需要嵌入manifest了,去掉CONFIG+= 后面的embed_manifest_dll embed_manifest_exe。
VC默認是“將wchar_t 視為內置類型”的,所以建議去掉-Zc:wchar_t-, 否則以后用到一些與wchar_t有關的函數(如fromWCharArray)時,就要在項目屬性里設置“將wchar_t視為內置類型”為No了)。
自己修改如下:
如果不希望編譯出來的DLL或EXE鏈接到VC運行時庫,就把-MD改成-MT,把-MDd改成-MTd(查找替換)。進入“Visual Studio 2010 命令提示”,其它版本的VC也一樣。
進入解壓的地方,比如我的: D:\SDK\Qt_4_7_2_VS2010\qt-everywhere-opensource-src-4.7.2。(小提示,在控制臺里輸入前幾個字符再按tab 鍵,可以自動填充路徑、文件名,MS在向Linux Shell學習?)
鍵入命令
- configure -debug-and-release -static -fast -opensource -platform win32-msvc2010
- -qt-gif -qt-zlib -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg -qt-sql-mysql
- -plugin-sql-mysql -qt-sql-odbc -plugin-sql-odbc -qt-sql-sqlite -plugin-sql-sqlite
- -prefix D:\SDK\Qt_4_7_2_VS2010\static -nomake docs -nomake demos -nomake examples
(去掉了 -qt-sql-mysql -plugin-sql-mysql,因為編譯到多一半的時候會提示找不到mysql的一些文件,估計還要下一些第三方的東西才能編譯qtsql庫吧,所以試了一次出錯之后,直接去掉了)
具體命令的參數在參考文章1、3中都有介紹
輸入configure -help可以顯示所有選項的幫助信息,上面是我用的選項,解釋一下:
-prefix 路徑名 編譯后的安裝路徑
-debug-and-release 編譯Debug和Release版本
-static 編譯靜態庫,如果不指定,默認為編譯成DLL
-opensource 使用LGPL協議,如果不指定也行,configure運行后會問的
-no-qt3support 不用編譯與QT3兼容的一些廢棄函數,如果你比較熟悉QT3,還是去掉它吧
-no-dbus 不用鏈接到DBus庫,這個庫偶好像在Linux里看到過,Windows里不用。
-no-phonon 同上,不要鏈接
-no-webkit 是否編譯Web相關的一些QT子庫,加上這個可以省不少編譯時間,就看你是否準備用這些庫了。
-qt-gif 使用QT自帶的gif庫
-qt-zlib 使用QT自帶的zlib庫
-qt-libpng 使用QT自帶的libpng庫
-qt-libmng 使用QT自帶的libmng庫
-qt-libtiff 使用QT自帶的libtiff庫
-qt-libjpeg 使用QT自帶的libjpeg庫
其中, -nomake docs -nomake demos -nomake examples -platform win32-msvc2010都是參考的文章3中的內容。
configure之后,把QT源碼里修改后的“mkspecs” 文件夾復制到準備存放“成品”的地方,比如我的就是把D:\SDK\Qt_4_7_2_VS2010\qt-everywhere-opensource-src-4.7.2\mkspecs復 制到D:\SDK\Qt_4_7_2_VS2010\static里 。(文章1中是想將mkspecs拷貝,然后再static文件夾中修改,沒徹底搞明白,但是自己是修改并congifure之后進行的拷貝)
- Nmake (大概1個小時)
- Nmake install (大概2個小時)(同樣在D:\SDK\Qt_4_7_2_VS2010\qt-everywhere-opensource-src-4.7.2
- 目錄下執行,功能是將生成的lib文件安裝到之前命令中 -prefix指向的位置)
- Nmake clean (5、6分鐘,和static文件夾沒關系,只是在源代碼的文件夾中進行清理工作)
系統中用戶名是中文的情況:
在編譯過程中碰到的***的問題是目錄名的問題,QT本身不支持漢語目錄名和帶空格的目錄名,就算源程序和編譯目錄滿足這個條件,然而QT在編譯過程中,會大量使用TEMP文件,Window 7系統的TEMP目錄在C:\Users\[用戶名]\AppData\Local\Temp下,如果當前用戶是中文的名,在QT編譯過程中就是致命的。***的解決辦法就是吧window的TEMP目錄設置在根目錄下我就是設置在C:\TEMP 。(Windows下設置用戶的環境變量,把里面的TEMP 和TMP 全部設置成C:\TEMP)
過程中的一次錯誤(操作步驟沒錯,只是其中一個地方馬虎了一下):
發生錯誤,錯誤的原因是,運行了VS2010命令行的(X64)版本,configure后,不能nmake
因為這個問題郁悶了一下午,從來了好幾次,上網查了半天,有的說是環境變量的問題,自己有手動將VS2010添加到path路徑中,還是不行,后來仔細一琢磨,這個錯誤在網上出現的很少,應該不是普遍問題,應該是很難遇到的問題,估計自己的操作有問題,仔細一檢查發現,打開的程序記錄里,剛才運行的是VS2010命令行的X64兼容版本,而且從信息操作了幾次,這個命令行窗口一直沒關,一直用的是X64版本的命令行。
小結:VS2010編譯Qt 4.7.2 靜態庫(測試成功)的內容后介紹完了,希望本篇對你有所幫助!