解析 QT 4.5.1編譯
QT 4.5.1編譯從 http://www.qtcentre.org/ 下載QT源代碼,注意是源代碼。我下載到的是QT4.5.1版,文件名為qt-win-opensource-src-4.5.1.zip。
解壓,注意不要解壓路徑不要含有空格或中文,我把它解壓到了d:\qt451里
準備一個存放編譯后“成品”的文件夾,我準備放在d:\qt451\static里
把QT源碼里的“mkspecs” 文件夾復制到準備存放“成品”的地方,比如我的就是把d:\qt451\qt-win-opensource-src-4.5.1\mkspecs復制到d:\qt451\static里
用記事本或其它編輯器打開D:\qt451\static\mkspecs\win32-msvc2005\qmake.conf(注 意VC版本號),按需要修改:
如果不希望編譯出來的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了)。
進入“Visual Studio 2005 命令提示”,其它版本的VC也一樣。
進入解壓的地方,比如我的: cd d:\qt451\qt-win-opensource-src-4.5.1。(小提示,在控制臺里輸入前幾個字符再按tab 鍵,可以自動填充路徑、文件名,MS在向Linux Shell學習?)
鍵入命令
- configure -prefix d:\qt451\static -debug-and-release -static
- -opensource -no-qt3support -no-dbus -no-phonon -no-webkit
- -qt-gif -qt-zlib -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg
輸入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庫
configure可能要花幾分鐘時間,成功后再輸入nmake開 始編譯,編譯會花去大概1小時(和配置有關啦,我是以我的老爺機為參考的)。
輸入nmake install
如果沒出錯的話,“QT成品”就已經在我們之前建立的成品路徑里了(我的是d:\qt451\static)
VC只需要成品路徑里的東東就夠了,如果你想,可以刪除解壓的那些源代碼省點空間。
測試是否成功
1、打開VC
2、新建項目
3、設置項目屬性
4、配置屬性->C/C++->常規->附加包含目錄:D:\qt451\ static\include
5、配置屬性->C/C++->代碼生成->運行時庫:多線程調試(/MTd),這 條依據你當時修改qmake.conf的情況決定
6、配置屬性->鏈接器->常規->附加庫目錄:d:\qt451\static\ lib
7、配置屬性->鏈接器->輸入->附加依賴項:qtmaind.lib QtCored4.lib QtGuid4.lib,如果要編譯Release,把后面的d去掉。
代碼:
- #include <Qt/QtGui>
- int APIENTRY _tWinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPTSTR lpCmdLine,
- int nCmdShow)
- {
- QApplication app(__argc, __argv);
- QLabel *label = new QLabel("Hello Qt!");
- label->show();
- return app.exec();
- }
注:如果編譯的是動態庫,那么要把QT成品里的bin目錄加入path系統變量,或者把這里用到的DLL復制到與你的程序相同的目錄里,一般是 QtCore4.dll和QtGui4.dll(Debug版為QtCored4.dll和QtGuid4.dll),依你使用的子庫而定。
【編輯推薦】