windows下 Qt 靜態編譯

2021-06-20 06:08:49 字數 2332 閱讀 7243

**:

似乎一直沒有靜態編譯qt的需求:一不在沒有管理員許可權的機器上使用,二不製作綠色軟體,三...。動態編譯工作得很好,再配合 nsis 製作乙個安裝包,有什麼必要靜態編譯呢?

正好利用週末時間,自己嘗試編譯一下,順便整理一下,看看到底會發生什麼(儘管以後還是用動態編譯)。

沒特殊說明的話,以下討論的是 msvc2008 下的情況:

或許有兩個層次:

configure
然後執行 nmake 就進入漫長的等待了,結束後qt編譯就完成了。

執行 configure -h 可以得到詳細的幫助資訊,包括預設啟用哪些引數等。

*  -shared ............ create and use shared qt libraries. 

-static ............ create and use static qt libraries.

如果我們要靜態編譯,只需要在 configure 後新增 -static 就行了。當然根據個人喜好,你可能會新增更多的引數,比如 -no-qt3support 禁用 qt3 支援模組等,不過這與靜態編譯沒有直接關係了。

這樣一來,我們將得到

而不是通過 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)。編譯時有選擇地去掉一些東西是比較合適的

禁止編譯例子和demo,當系統中存在多套qt時,編譯例子確實不太需要,但 configure 沒有相應的引數來禁止 demo 和 例子

可以修改 qt 根目錄下的 .qmake.cache 中的qt_build_parts

執行完 configure 後,我們也可以通過執行

make sub-src
而不是
make
來避免編譯非必須的東西

編譯完成後,執行

make confclean
來清理編譯過程中的中間產物

當採用靜態編譯後,外掛程式問題更嚴重了,為什麼呢?外掛程式都成靜態庫了,無法動態載入了(或許已不能被稱為外掛程式了)

靜態編譯時外掛程式的使用(比如,jpeg和gb2312的支援):

#include

q_import_plugin(qjpeg)

q_import_plugin(qcncodecs)

qtplugin += qjpeg qcncodecs
採用 mingw 靜態編譯qt的步驟和上面基本一樣(給configure傳遞 -static引數)。

再就是,修改

%qtdir%\mkspecs\win32-msvc2005\qmake.conf
為qmake_lflags新增 -static 選項

但是 mingw 編譯的程式會依賴下面的動態庫

對後libgcc這個庫,似乎還好辦,一種說法是修改 \qmake\makefile.win32-* 中的

lflags =

lflags = -static-libgcc
這個我沒試,qt4.6.3中 lflags 預設確實為空,但qt4.7中預設已經新增了該選項

對與 mingwm10 這個動態庫,似乎比較難辦。因為它似乎和

有關。提高自我修養,實事求是,掌握先進技術!

低調做人,認真做事,立志成為優秀人才!

——風行雪舞

windows下 Qt 靜態編譯

似乎一直沒有靜態編譯qt的需求 一不在沒有管理員許可權的機器上使用,二不製作綠色軟體,三.動態編譯工作得很好,再配合 nsis 製作乙個安裝包,有什麼必要靜態編譯呢?正好利用週末時間,自己嘗試編譯一下,順便整理一下,看看到底會發生什麼 儘管以後還是用動態編譯 沒特殊說明的話,以下討論的是 msvc2...

Windows下靜態編譯QT程式

windows下編寫的qt程式拿到別的機器上執行時總是要打包dll,編譯成靜態程式更方便一些。編譯前先修改一下spec 下面是對於vs2008,如果是2005,則去找win32 msvc2005 mkspecs win32 msvc2008 qmake.conf 修改qmake cflags rel...

windows 下 QT 5 6 靜態編譯

請遵守lgpl協議。編譯準備 visual studio 2010 qt5.6.1 source code google angle source code directx sdk 編譯的電腦顯示卡比較老opengl版本公升不上去,所以使用angle google的opengle es轉到direc...