天天看點

Qt4.6.2已編譯二進制版本在VS2005中的問題

結論1:

如果你想把Qt4.6.2安裝在VS2005中,又不想花時間編譯,請下載下傳和安裝qt-win-opensource-4.6.2-vs2008,并單獨編譯“QT安裝路徑/src/winmain/”

結論2:

在安裝qt-win-opensource-4.6.2-vs2008(msvc9/vs2008已編譯版)之前千萬不要安裝qt-sdk-win-opensource-2010.02.1(miniGW已編譯版),如果不幸安裝了,請先卸掉它,切記!

問題描述及解決過程:

我在Nokia的QT官方頁面下載下傳了QT的最新版本(Windows平台下已編譯的安裝版本,安裝檔案名稱為:qt-sdk-win-opensource-2010.02.1.exe),安裝後發現是miniGW版本(即Windows下的GCC編譯版本,庫檔案是*.a和*.so),并不适合于msvc編譯器。

沒辦法,再到Nokia的QT官方下載下傳頁面(好多個版本,我都不知道它們之間的差別),找到專用于VC編譯器的已編譯二進制版本(安裝檔案名稱為:qt-win-opensource-4.6.2-vs2008.exe)。安裝檔案名标明了VS2008(隻能用于VS2008?),而我的機器上安裝的是VS2005,不管了,裝了再說。于是,我的痛苦經曆來了!

安裝過程倒很順利。裝完後建了個測試工程,發現Release配置下編譯連結運作都正常,但在Debug下連結通不過,提示:

qtmaind.lib(qtmain_win.obj) : fatal error LNK1103: 調試資訊損壞;請重新編譯子產品

初步估計這個靜态庫是用msvc9編譯出來的,用msvc8的連結器連結它,連結器不幹了!沒關系,重新編譯這個靜态庫嘛,不費勁。在開始菜單打開“Visual Studio 2005 指令提示”指令行視窗,切換目前路徑(cd)到“D:/Qt/4.6.2/src/winmain”(注意我的QT安裝路徑是D:/Qt/4.6.2),分别執行下列指令:

[c-sharp] view plain copy

  1. rem 生成工程的makefile檔案  
  2. qmake winmain.pro  
  3. rem 生成靜态庫  
  4. nmake  

到目錄“D:/Qt/4.6.2/lib”下檢查,發現qtmain.lib和qtmaind.lib兩個檔案已經更新了,就是說,這兩個庫已經是msvc8/vs2005生成出來的了。

再在例子工程中選Debug模式生成,連結成功了!激動!但很快就被撥了冷水——調試運作時,彈出程式在某記憶體處運作出錯的視窗,程式崩潰了。怎麼辦?例子工程肯定是沒問題的,崩潰代碼應該出現在qtmaind.lib庫中。

仔細分析qtmaind.lib的源代碼($QTDIR/src/winmain/),它隻有一個函數,就是大名鼎鼎的WinMain函數!我們知道,CRT運作時庫将調用WinMain函數開始Windows下的窗體程式運作。這個WinMain函數也不複雜,就是先調用qWinMain()初始化QT環境,然後檢查系統中有沒有該程式的程序,有的話就不啟動了,這樣能確定程式隻能有一個執行個體;最後調用main(),就是我們Qt例子工程中的main函數,真正啟動程式。

我在qtmaind.lib工程的WinMain函數開始處添加“彈出一個MessageBox”的代碼,目的是測試程式有沒有運作到這裡。我失望了,Debug下沒有運作到WinMain,程式就崩潰了。(Release下确實先彈出了這個消息框才運作程式)

就是說,在WinMain之前,程式就崩潰了。難道是MS-CRT運作庫的入口函數(CRTStartUp?)有問題?或者QT中用了全局對象,出題出現在全局對象的構造函數?很有可能。

到這裡,已經超出了我的能力範圍,我不能跟下去了。沒辦法,隻得重新編譯整個QT!

編譯QT的時間是很長的,動不動就幾個鐘,這都還可以接受了。但是,編譯過程總是出現錯誤,最後強制nmake所有子產品,忽略編譯中出現的錯誤。終于編譯好了,測試,Debug下問題依舊——崩潰,又見崩潰!懷疑編譯過程不順利造成了,試着找另一個版本的源代碼(qt-sdk-win-opensource-2010.02.1)再重新編譯,問題依舊,懷疑真不能在VS2005下使用了。就這樣搞了我好幾天!!!

今天把VS2008也裝上了,結果在Debug下運作仍然崩潰,但提示不同了,找不了某某某連結符号。

然後我把qt-sdk-win-opensource-2010.02.1(miniGW已編譯版)和qt-win-opensource-4.6.2-vs2008(msvc9/vs2008已編譯版)都卸了,重新開機,再重新裝上qt-win-opensource-4.6.2-vs2008,再用msvc8/vs2005重新編譯qtmain.lib靜态庫,居然發現,一切問題解決了!

結論:

在安裝qt-win-opensource-4.6.2-vs2008(msvc9/vs2008已編譯版)之前千萬不要安裝qt-sdk-win-opensource-2010.02.1(miniGW已編譯版),如果安裝了,請先卸掉它,切記!

http://blog.csdn.net/flyoxs/article/details/5604626