自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Windows下 Qt 靜態(tài)編譯連接

移動(dòng)開(kāi)發(fā)
本文介紹的是Windows下 Qt 靜態(tài)編譯連接,Qt的靜態(tài)和動(dòng)態(tài),前面的內(nèi)容也有所介紹,先來(lái)看本文的靜態(tài)編譯。

關(guān)于Windows下 Qt 靜態(tài)編譯連接,似乎一直沒(méi)有靜態(tài)編譯Qt的需求:一不在沒(méi)有管理員權(quán)限的機(jī)器上使用,二不制作綠色軟件,三動(dòng)態(tài)編譯工作得很好,再配合 nsis 制作一個(gè)安裝包,有什么必要靜態(tài)編譯呢?

但論壇中似乎總是不停有人問(wèn)到靜態(tài)編譯的問(wèn)題,似乎遇到問(wèn)題的人挺多,用百度或google搜索"Qt靜態(tài)編譯"也能搜到相當(dāng)多的內(nèi)容。

正好利用周末時(shí)間,自己嘗試編譯一下,順便整理一下,看看到底會(huì)發(fā)生什么(盡管以后還是用動(dòng)態(tài)編譯)。

沒(méi)特殊說(shuō)明的話,以下討論的是 MSVC2008 下的情況:

靜態(tài)編譯

或許有兩個(gè)層次:

編譯出的程序不依賴 QtCore4.dll、QtGui4.dll 等 Qt 的靜態(tài)庫(kù)

編譯出的程序不依賴 msvcr90.dll、msvcp90.dll 等 C、C++ 的運(yùn)行庫(kù)

編譯Qt

Qt 默認(rèn)是動(dòng)態(tài)編譯的,下載Qt的源碼,解壓,而后運(yùn)行(當(dāng)系統(tǒng)中有多套編譯環(huán)境時(shí),需要通過(guò)platform參數(shù)指定所用編譯環(huán)境 -platform win32-msvc)

configure然后運(yùn)行 nmake 就進(jìn)入漫長(zhǎng)的等待了,結(jié)束后Qt編譯就完成了。

運(yùn)行 configure -h 可以得到詳細(xì)的幫助信息,包括默認(rèn)啟用哪些參數(shù)等。

  1. *  -shared ............ Create and use shared Qt libraries.     
  2.  -static ............ Create and use static Qt libraries. 

如果我們要靜態(tài)編譯,只需要在 configure 后添加 -static 就行了。當(dāng)然根據(jù)個(gè)人喜好,你可能會(huì)添加更多的參數(shù),比如 -no-qt3support 禁用 qt3 支持模塊等,不過(guò)這與靜態(tài)編譯沒(méi)有直接關(guān)系了。

這樣一來(lái),我們將得到QtCore.lib QtCored.lib 等靜態(tài)庫(kù)而不是

QtCore4.lib QtCored4.lib 等導(dǎo)入庫(kù)

QtCore4.dll QtCored4.dll 等動(dòng)態(tài)庫(kù)

去除C、C++運(yùn)行庫(kù)的依賴

通過(guò) configure 的 -static 選項(xiàng),我們可以編譯出 Qt 的靜態(tài)庫(kù),如果只是不想發(fā)布程序時(shí)發(fā)布Qt的動(dòng)態(tài)庫(kù),這個(gè)已經(jīng)完成了。

但是,它們?nèi)砸蕾?C、C++ 的運(yùn)行庫(kù)。如果還想去除該依賴,需要在靜態(tài)編譯Qt之前手動(dòng)修改

  1. %QTDIR%\mkspecs\win32-msvc2008\qmake.conf 

將 QMAKE_CFLAGS_RELEASE 和 QMAKE_CFLAGS_DEBUG 中的 -MD -MDd 分別修改為 -MT 和 -MTd 即可。 這4個(gè)參數(shù)的含義很容易通過(guò)cl /?得到,另外,還可以將 CONFIG 中的 embed_manifest_dll embed_manifest_exe 去掉(也可以不去掉)。

注意:對(duì) qmake.conf 的修改最好放在運(yùn)行 configure 之前,不然的話,修改后還需要手動(dòng)運(yùn)行(原因你知道的 ;-) )

qmake -r如何加快編譯

編譯 Qt,應(yīng)該是一個(gè)比較費(fèi)時(shí)費(fèi)力費(fèi)空間的(磁盤中沒(méi)有15G的空閑空間,都不敢編譯Qt4.7)。編譯時(shí)有選擇地去掉一些東西是比較合適的

禁止編譯不需要的模塊,比如 Qt3Support,QtWebkit,等運(yùn)行 configure -h 可以得到詳細(xì)的參數(shù)列表,禁止編譯例子和demo,當(dāng)系統(tǒng)中存在多套Qt時(shí),編譯例子確實(shí)不太需要,但 configure 沒(méi)有相應(yīng)的參數(shù)來(lái)禁止 demo 和例子非windows系統(tǒng)下 configure 似乎支持 -nomake examples -nomake demos可以直接移除 demoes 和 examples 目錄(移除肯定就不會(huì)編譯了,但個(gè)人不喜歡這個(gè)) 可以修改 Qt 根目錄下的 projects.pro 文件

方法一 注釋掉 SUBDIRS += demos 這樣的行

方法二 直接修改 QT_BUILD_PARTS = libs tools examples demos docs translations

可以修改 Qt 根目錄下的 .qmake.cache 中的 QT_BUILD_PARTS

運(yùn)行完 configure 后,我們也可以通過(guò)運(yùn)行 make sub-src而不是 make來(lái)避免編譯非必須的東西

編譯完成后,運(yùn)行 make confclean來(lái)清理編譯過(guò)程中的中間產(chǎn)物

插件問(wèn)題

動(dòng)態(tài)編譯時(shí),插件似乎困擾不少人,經(jīng)常有人抱怨,程序發(fā)布后,jpeg圖片無(wú)法顯示?中文顯示亂碼等等?

解決方法很簡(jiǎn)單,發(fā)布時(shí)帶上插件就行了(注意路徑)

當(dāng)采用靜態(tài)編譯后,插件問(wèn)題更嚴(yán)重了,為什么呢?插件都成靜態(tài)庫(kù)了,無(wú)法動(dòng)態(tài)加載了(或許已不能被稱為插件了)

看 QtPlugin 的Manual,有關(guān)于靜態(tài)插件的使用介紹

看例子中 tools/plugandpaint 例子,使用的靜態(tài)插件

常用插件

圖片插件 qgif qjpeg qico 等

數(shù)據(jù)庫(kù) qsqlite 等

東亞語(yǔ)言 qcncodecs 等

phonon 后端支持插件

QStyle 插件
...
靜態(tài)編譯時(shí)插件的使用(比如,jpeg和gb2312的支持):

在 cpp 文件(main.cpp)內(nèi)添加語(yǔ)句

  1. #include<QtPlugin>Q_IMPORT_PLUGIN(qjpeg) Q_IMPORT_PLUGIN(qcncodecs)pro 文件內(nèi)添加  
  2. QTPLUGIN += qjpeg qcncodecs對(duì)于Mingw 

采用 Mingw 靜態(tài)編譯Qt的步驟和上面基本一樣(給configure傳遞 -static參數(shù))。

再就是,修改

%QTDIR%\mkspecs\win32-msvc2005\qmake.conf為 QMAKE_LFLAGS 添加 -static 選項(xiàng)

但是 MinGW 編譯的程序會(huì)依賴下面的動(dòng)態(tài)庫(kù)

  1. mingwm10.dll  
  2. libgcc_s_dw2-1.dll 

對(duì)后libgcc這個(gè)庫(kù),似乎還好辦,一種說(shuō)法是修改 <QTDIR>\qmake\Makefile.win32-* 中的

LFLAGS =為

LFLAGS = -static-libgcc這個(gè)我沒(méi)試,Qt4.6.3中 LFLAGS 默認(rèn)確實(shí)為空,但Qt4.7中默認(rèn)已經(jīng)添加了該選項(xiàng)

對(duì)與 mingwm10 這個(gè)動(dòng)態(tài)庫(kù),似乎比較難辦。因?yàn)樗坪鹾彤惓?、線程有關(guān)。

小結(jié):Windows下 Qt 靜態(tài)編譯連接的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!如果還是不明白的話,請(qǐng)參考 解析 QT 靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù) 。希望你能用到!

責(zé)任編輯:zhaolei 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-06-21 17:01:44

Qt 靜態(tài) 編譯

2011-08-29 09:33:24

WindowsQt庫(kù)靜態(tài)

2011-06-21 16:51:21

Qt 靜態(tài) 編譯

2011-07-05 13:32:45

QT Mysql 驅(qū)動(dòng)

2011-07-05 09:25:05

Qt MySQL 驅(qū)動(dòng)

2011-07-05 10:44:51

Qt Sqlite 靜態(tài)編譯

2011-06-29 17:00:26

QT 靜態(tài)編譯 Debug

2011-07-01 12:52:50

Ubuntu Qt wxWidgets

2011-06-21 17:35:11

Qt Creator 編譯

2011-06-16 10:09:25

QT Windows DLL

2011-06-24 17:05:07

QT QT 4.7.3 windows

2011-07-02 14:11:46

Qt Gtk Ubuntu

2011-06-23 09:54:00

VS2010 Qt 4.7.2 Qt

2011-07-05 13:44:17

2011-06-10 10:31:57

QT mysql linux

2011-07-05 10:03:00

Qt MYSQL 數(shù)據(jù)庫(kù)

2011-06-08 15:27:24

QT QT 4.5 編譯

2011-06-09 15:18:07

QT 編譯

2011-07-02 14:03:12

Linux Qt

2011-08-29 10:11:49

QTWindowsVisual Stud
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)