windows下 Qt 静态编译
似乎一直沒有靜態編譯Qt的需求:一不在沒有管理員權限的機器上使用,二不制作綠色軟件,三...。動態編譯工作得很好,再配合 nsis 制作一個安裝包,有什么必要靜態編譯呢?
但論壇中似乎總是不停有人問到靜態編譯的問題,似乎遇到問題的人挺多,用百度或google搜索"Qt靜態編譯"也能搜到相當多的內容。
正好利用周末時間,自己嘗試編譯一下,順便整理一下,看看到底會發生什么(盡管以后還是用動態編譯)。
沒特殊說明的話,以下討論的是 MSVC2008 下的情況:
靜態編譯?或許有兩個層次:
-
編譯出的程序不依賴 QtCore4.dll、QtGui4.dll 等 Qt 的靜態庫
- 編譯出的程序不依賴 msvcr90.dll、msvcp90.dll 等 C、C++ 的運行庫
Qt 默認是動態編譯的,下載Qt的源碼,解壓,而后運行(當系統中有多套編譯環境時,需要通過platform參數指定所用編譯環境 -platform win32-msvc)
configure然后運行 nmake 就進入漫長的等待了,結束后Qt編譯就完成了。
運行 configure -h 可以得到詳細的幫助信息,包括默認啟用哪些參數等。
* -shared ............ Create and use shared Qt libraries.?-static ............ Create and use static Qt libraries.
如果我們要靜態編譯,只需要在 configure 后添加 -static 就行了。當然根據個人喜好,你可能會添加更多的參數,比如 -no-qt3support 禁用 qt3 支持模塊等,不過這與靜態編譯沒有直接關系了。
這樣一來,我們將得到
-
QtCore.lib QtCored.lib 等靜態庫
而不是
-
QtCore4.lib QtCored4.lib 等導入庫
-
QtCore4.dll QtCored4.dll 等動態庫
通過 configure 的 -static 選項,我們可以編譯出 Qt 的靜態庫,如果只是不想發布程序時發布Qt的動態庫,這個已經完成了。
但是,它們仍依賴 C、C++ 的運行庫。如果還想去除該依賴,需要在靜態編譯Qt之前手動修改
%QTDIR%\mkspecs\win32-msvc2008\qmake.conf將 QMAKE_CFLAGS_RELEASE 和 QMAKE_CFLAGS_DEBUG 中的 -MD -MDd 分別修改為 -MT 和 -MTd 即可。 這4個參數的含義很容易通過
cl /?得到
另外,還可以將 CONFIG 中的 embed_manifest_dll embed_manifest_exe 去掉(也可以不去掉)。
注意:對 qmake.conf 的修改最好放在運行 configure 之前,不然的話,修改后還需要手動運行(原因你知道的 ;-) )
qmake -r如何加快編譯編譯 Qt,應該是一個比較費時費力費空間的(磁盤中沒有15G的空閑空間,都不敢編譯Qt4.7)。編譯時有選擇地去掉一些東西是比較合適的
-
禁止編譯不需要的模塊,比如 Qt3Support,QtWebkit,等
- 運行 configure -h 可以得到詳細的參數列表
- 禁止編譯例子和demo,當系統中存在多套Qt時,編譯例子確實不太需要,但 configure 沒有相應的參數來禁止 demo 和 例子
-
非windows系統下 configure 似乎支持?-nomake examples -nomake demos
- 可以直接移除 demoes 和 examples 目錄(移除肯定就不會編譯了,但個人不喜歡這個)
- 可以修改 Qt 根目錄下的 projects.pro 文件
-
方法一 注釋掉?SUBDIRS += demos?這樣的行
-
方法二 直接修改?QT_BUILD_PARTS = libs tools examples demos docs translations
-
-
可以修改 Qt 根目錄下的 .qmake.cache 中的?QT_BUILD_PARTS
-
- 運行完 configure 后,我們也可以通過運行 make sub-src 而不是 make 來避免編譯非必須的東西
- 編譯完成后,運行 make confclean 來清理編譯過程中的中間產物
- 動態編譯時,插件似乎困擾不少人,經常有人抱怨,程序發布后,jpeg圖片無法顯示?中文顯示亂碼等等?
- 解決方法很簡單,發布時帶上插件就行了(注意路徑)
- 當采用靜態編譯后,插件問題更嚴重了,為什么呢?插件都成靜態庫了,無法動態加載了(或許已不能被稱為插件了)
-
看 QtPlugin 的Manual,有關于靜態插件的使用介紹
- 看例子中 tools/plugandpaint 例子,使用的靜態插件
-
- 圖片插件 qgif qjpeg qico 等
- 數據庫 qsqlite 等
- 東亞語言 qcncodecs 等
- phonon 后端支持插件
- QStyle 插件
- ...
靜態編譯時插件的使用(比如,jpeg和gb2312的支持):
- 在 cpp 文件(main.cpp)內添加語句
#include<QtPlugin>
Q_IMPORT_PLUGIN(qjpeg)?
Q_IMPORT_PLUGIN(qcncodecs)
- pro 文件內添加
QTPLUGIN += qjpeg qcncodecs對于Mingw
采用 Mingw 靜態編譯Qt的步驟和上面基本一樣(給configure傳遞 -static參數)。
再就是,修改
%QTDIR%\mkspecs\win32-msvc2005\qmake.conf為?QMAKE_LFLAGS?添加 -static 選項
但是 MinGW 編譯的程序會依賴下面的動態庫
- mingwm10.dll
- libgcc_s_dw2-1.dll
對后libgcc這個庫,似乎還好辦,一種說法是修改 <QTDIR>\qmake\Makefile.win32-* 中的
LFLAGS =為
LFLAGS = -static-libgcc這個我沒試,Qt4.6.3中 LFLAGS 默認確實為空,但Qt4.7中默認已經添加了該選項
對與 mingwm10 這個動態庫,似乎比較難辦。因為它似乎和
- 異常
- 線程
有關。
參考-
http://qtnode.net/wiki?title=Building_static
-
http://qtnode.net/wiki/Qt4_with_Visual_Studio_and_static_C_runtime
-
http://www.formortals.com/how-to-statically-link-qt-4/
-
http://www.formortals.com/build-qt-static-small-microsoft-intel-gcc-compiler/
-
http://www.qtcentre.org/threads/29489-Removing-dependencies-for-mingwm10.dll-and-libgcc_s_dw2-1.dll-static-linking
-
http://blog.lugru.com/2010/04/static-qt-compilation-and-mingwm10-dll-mingw-confusion/
-
總結
以上是生活随笔為你收集整理的windows下 Qt 静态编译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt 程序在 windows 下的发布
- 下一篇: Qt 4.7.4 完美动态编译发布动态调