似乎一直沒有靜態編譯qt的需求:一不在沒有管理員許可權的機器上使用,二不製作綠色軟體,三...。動態編譯工作得很好,再配合 nsis 製作乙個安裝包,有什麼必要靜態編譯呢?
正好利用週末時間,自己嘗試編譯一下,順便整理一下,看看到底會發生什麼(儘管以後還是用動態編譯)。
沒特殊說明的話,以下討論的是 msvc2008 下的情況:
或許有兩個層次:
configure然後執行 nmake 就進入漫長的等待了,結束後qt編譯就完成了。
執行 configure -h 可以得到詳細的幫助資訊,包括預設啟用哪些引數等。
* -shared ............ create and use shared qt libraries.如果我們要靜態編譯,只需要在 configure 後新增 -static 就行了。當然根據個人喜好,你可能會新增更多的引數,比如 -no-qt3support 禁用 qt3 支援模組等,不過這與靜態編譯沒有直接關係了。-static ............ create and use static qt libraries.
這樣一來,我們將得到
而不是通過 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的支援):
#includeq_import_plugin(**peg)
q_import_plugin(qcncodecs)
qtplugin += **peg 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...