熱點推薦:
您现在的位置: 電腦知識網 >> 操作系統 >> Windows系統管理 >> 正文

QT程序在windows下部署發布

2013-11-11 21:29:34  來源: Windows系統管理 

  QT程序在windows下部署發布

  以下包括了部分網上收集的以及qt幫助裡的內容(Deploying an Application on Qt/Windows)

  首先打開windows控制台然後找到vs安裝目錄下的bin裡執行 vcvarsbat 這個腳本執行完之後vs需要的所有環境變量就已經設置好了

  然後做下面的操作

  我的環境是QT + mingwmake

  部署發布QT程序有兩種方法

  第一種靜態編譯可生成單一的可執行文件

  第二種動態編譯需同時附上需要的dll文件

  一靜態編譯

   編譯QT

  要靜態編譯首先要求QT是靜態編譯過的在QT目錄下執行

  configureexe static release

  make subsrc

  就可以編譯出靜態庫如果只是用來分發程序也可以mingwmake release subsrc只編譯一個靜態庫

  這個過程需要個小時QT目錄會變成G左右mingwmake和make是一樣的

  如果用VC平台在編譯Qt的時候configureexe static platform winmsvc

  然後nmake subsrc或者nmake release subsrc完成靜態編譯

   編譯程序

  然後到你自己的程序目錄下執行

  make clean

  qmake config release

  make

  這時會得到一個非常大的可執行程序但也會有一個重要的問題就是圖片文件顯示不出來

  按照QT幫助的說法QT裡的jpeggif等圖片的支持都是以插件的形式存在的現在我們還沒有包含任何插件

   加入插件

  在maincpp裡

  #include <QApplication>

  #include <QtPlugin> //這個

  Q_IMPORT_PLUGIN(qjpeg) //這個

  Q_IMPORT_PLUGIN(qgif) //這個

  int main(int argc char *argv[])

  {

  QApplication app(argc argv)

  …

  return appexec()

  }

  在pro裡加入

  QTPLUGIN += qjpeg qgif

  CONFIG += static

  QT的幫助裡就做到這裡但我編譯程序時出錯如下

  release/maino(text+×cmaincpp:

  undefined reference to `qt_plugin_instance_qgif()

  undefined reference to `qt_plugin_instance_qjpeg()

  經過長時間研究發現了解決問題的辦法

   加入LIBS

  在pro中加入

  LIBS += C:/Qt//plugins/imageformats/libqgifa

  LIBS += C:/Qt//plugins/imageformats/libqjpega

  如果QT靜態編譯正確的話你應該上面這個目錄下看到這兩個文件libqgifa和libqjpega (據說以前的QT版本也可能是lib或o文件)

  這時已經可以正常編譯運行了但還是需要mingwmdll才能運行

   解決MinGW的mingwmdll依賴問題

  在Makefilerelease裡找到

  LFLAGS = enablestdcallfixup Wlenableautoimport Wlenableruntimepseudoreloc static Wls Wl mthreads Wl subsystemwindows

  刪除其中的mthreads

  quote:

  一般只有用到 threads的時候才用到mingwmdll我們通常遇到的缺少mingwmdll問題可以在程序qmake生成 makefilerelease文件後刪除mthreads參數即可一般在 LFLAGS後面當然這只是臨時解決方案每次都要手動修改也可以在編譯QT前先修改qmakeh不過不推薦這種方法其實 mingwmdll也就十多K每次發布程序時一起打包也無所謂

  這時編譯同樣得到一個非常大的可執行程序(我寫的這個貪吃蛇一共多行生成的exe有M)用AspPack壓縮一下就可以發給用戶了(這時是M)

  quote: 這樣編譯出來的程序比較大可以先用strip命令去掉程序裡面一些無用信息後用ASPack或者UPX之類的壓縮加殼軟件壓縮一下兩者的壓縮率基本都達到%多一點壓縮效果還是很明顯的

  二動態編譯

  動態編譯就很容易了用QT的默認安裝把生成的release下的exe文件和下面幾個核心文件放在一個文件夾裡

  MINGWM DLL

  QTGUIDLL

  QTCOREDLL

  VC編譯程序運行時需要的幾個dll文件

  MicrosoftVCCRTmanifest 位於x:\Program Files\Microsoft Visual Studio \VC\redist\x\\MicrosoftVCCRT

  msvcmdll

  msvcpdll

  msvcrdll

  QtCoredll

  QtGuidll

  這樣就可以運行了但圖片文件還是可能顯示不出來解決辦法

  把程序文件夾裡建立一個imageformats目錄(必須是這個名字)把qt目錄下的plugin/imageformats目錄下對應的dll文件copy過去這樣動態連接就完成了

  發布中文Qt程序時要注意的問題

  【本站開通在線QQ討論群】

  用Qt寫好了程序並撰寫了中文的語言文件(qm文件) 後發布到沒有安裝過Qt的系統上時卻發現只有固定的界面文字中的中文能正常顯示而程序運行過程中保存到諸如txtxml文件中的中文卻變成了奇怪的編碼而讀回時就會變成

  經 過研讀Qt的文檔總算知道了原因那是因為對於中文之類的特殊編碼文字Qt系統中是使用相應的TextCodec來進行Unicode到本地編碼 (GBGB等)的轉換的而這個TextCodec並不是靜態編譯到Qt的幾個庫文件中的而是在編譯完Qt系統後以Plugin 的形式出現在 /qt/plugins/codecs 目錄下如簡體中文的Codec庫文件名為qcncodecsdll而我發布Qt程序時只安裝了Qt的幾個主文件 (QtCoredllQtGuidll)所以造成了該系統上缺少中文Codec的問題

  解決方法很簡單有多種方法

  )將以上的中文編碼庫文件安裝到可執行程序的目錄下的 codecs 目錄下程序啟動時QtCore中的初始化過程會自動找到該目錄並加載到內存中

  )在Qt程序啟動時用代碼指定Qt的Library搜索路徑

  )編寫nfig文件放在可執行文件的目錄下並在其中定義Codecs的路徑

  )對於用static編譯的Qt在主程序文件中寫上這句宏指令Q_IMPORT_PLUGIN(qcncodecs)並在Link中加入相應的LIB文件

  具體內容我不多說了看Qt文檔吧 doc/html/l

  另外Qt的圖像解碼系統也是用Plugin的方式提供的如果忘了復制如jpeggif之類的解碼庫的話程序將只能顯示bmp和png的圖片了


From:http://tw.wingwit.com/Article/os/xtgl/201311/8576.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.