Qt項目發布的exe程序,默認是以動態鏈接形式的,這樣發布后的程序會附帶好多Qt自己的dll庫,這樣文件數量不僅多,而且移植到其他電腦上的時候,還可能會遇到,提示缺其他庫等各種運行不起來的情況。當然辦法還是有的,找到所有用到的庫一塊隨着exe發布就可以了。其實還有一種方法就是用靜態編譯發布程序。
下面是靜態編譯的流程。
文件准備
1、安裝VS2013
2、安裝python2.7,並設置環境變量
3、下載Qt5.4.2源碼文件,名字為
qt-everywhere-opensource-src-5.4.2.zip
lib庫
5、下載openssl,去官網下載最新版即可
在D盤下新建文件夾
qt-static-build
將Qt源碼解壓到
D:\qt-static-build\qt\qt-everywhere-opensource-src-5.4.2
將icu解壓到
D:\qt-static-build\icu
將openssl解壓到 D:\qt-static-build\openssl-0.9.8zh
,openssl需要編譯,可以參考
http://www.godebug.org/index.php/archives/104/ 將編譯后生成的ssl文件夾放到
D:\qt-static-build\ssl
文件修改
6、找到
F:\Qt\
qt-everywhere-opensource-src-5.4.2
\qtbase\mkspecs\win32-msvc2013\qmake.conf 文件,將原來的
QMAKE_CFLAGS_RELEASE = -O2 -MD -Zc:strictStrings
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi -Zc:strictStrings
QMAKE_CFLAGS_DEBUG = -Zi -MDd
改為
QMAKE_CFLAGS_RELEASE = -O2 -MT -Zc:strictStrings
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi -Zc:strictStrings
QMAKE_CFLAGS_DEBUG = -Zi -MTd
就是要將MD編譯模式給為MT編譯模式。
開始命令操作
7、找到開始菜單 所有程序->
Visual Studio 2013->Visual Studio Tools->VS2013 開發人員命令提示,打開“VS2013 開發人員命令提示
”。
8、輸入命令:cd
D:\qt-static-build\qt\qt-everywhere-opensource-src-5.4.2
,輸入命令:
F:
9、輸入命令:
set PATH=C:\Windows;C:\Windows\System32;C:\Ruby22\bin;C:\Python27;C:\Python27\Scripts;D:\qt-static-build\icu\lib;D:\qt-static-build\icu\bin;D:\qt-static-build\gles_sdk\x86;C:\Perl\bin;D:\qt-static-build\ssl\bin;
set INCLUDE=D:\qt-static-build\icu\include;D:\qt-static-build\gles_sdk\include;D:\qt-static-build\ssl\include;
set LIB=D:\qt-static-build\icu\lib;D:\qt-static-build\gles_sdk\x86;D:\qt-static-build\ssl\lib;
"D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86
10
、執行configure命令,輸入:
configure -confirm-license -opensource -platform win32-msvc2013 -debug-and-release -static-prefix "D:\qt-static-build\Qt5.4.2-static-vs2013"-qt-sql-sqlite -qt-sql-odbc -plugin-sql-sqlite -plugin-sql-odbc -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype -no-qml-debug -no-angle -nomake tests -nomake examples -icu -openssl
11
、上面的命令執行完后,輸入命令:
nmake
,然后就是漫長的等待了,要幾個小時呢。
12、
nmake
執行完后,輸入命令:nmake install
到此編譯QT的過程已經完成了。這時候你會在
D:\qt-static-build
里面找到文件夾
Qt5.4.2-static-vs2013
,這里面的所有東西都是我們靜態后生成的文件。
下面是QWebKit的編譯
先說下遇到的坑吧,不想看的可以忽略。
1、MTd與MDd不匹配的錯誤提示,這個問題我找了好長時間,原因我知道,是因為QWebKit是以MDd形式編譯的,但是就是
不知道為什么要以MDd形式編譯,后來我搜了下,發現Makefile文件里的參數是MD,我曾經想過要把所有Makefile里面的MD都改成MT
,但是感覺這個不靠譜,因為這些Makefile文件是動態生成的,所以肯定是生成的過程出問題了。搞了好長時間,后來發現是環境變量的
問題,由於我之前是用從官網下的exe文件安裝的Qt,當時將qmake.exe所在的bin目錄放到了環境變量里面。我將這個環境變量刪掉,
換成上面靜態編譯后生成的qmake.exe所在的bin目錄(
F:\Qt\Qt5.4.2-static-vs2013\bin
),這個問題就解決了。
2、安裝bison的時候我放到了
Program Files (x86)這個目錄下面,結果命令行就將這個路徑當成兩個命令來處理了。就提示報錯了
沒找到命令。這真實太坑了。把它安裝到不包含空格的目錄里就好了。
先准備要用到的軟件
1、
ActivePerl-MSWin32.msi
2、
bison-setup.exe
3、
gperf-bin.zip
4、
rubyinstaller.exe
5、
win_flex_bison.zip
由於編譯過程中用到了上面的命令,所以這些軟件是缺一不可的。裝完之后,記得要添加環境變量
上面的命令工具不要關,
執行下面命令
set PATH=%PATH%D:\qt-static-build\Qt5.4.2-static-vs2013\bin;
set INCLUDE=%INCLUDE%D:\qt-static-build\Qt5.4.2-static-vs2013\include;
然后執行命令(如果要編譯成release,將--debug改成--release即可)
perl D:\qt-static-build\qt\qt-everywhere-opensource-src-5.4.2\qtwebkit\Tools\Scripts\build-webkit --qt --debug --prefix=D:\qt-static-build\Qt5.4.2-static-vs2013
執行一次后,會暫停下來,再執行一次即可。
然后就是再次漫長的等待了!
期間碰到了下面的幾個錯誤:
錯誤 1、

解決辦法是:找到 F:\QT\qt-everywhere-opensource-src-5.4.2\qtwebkit\
Source\WebCore\platform\text\TextEncodingRegistry.cpp:301
改 #if OS(WINDOWS) 為 #if OS(WINCE)
錯誤 2、

解決辦法是:找到
F:\QT\qt-everywhere-opensource-src-5.4.2\qtwebkit\Source\WebCore\platform\qt\QtTestSupport.h
修改:
#if defined(BUILDING_WEBKIT)
#define TESTSUPPORT_EXPORT Q_DECL_EXPORT
#else
#define TESTSUPPORT_EXPORT Q_DECL_IMPORT
#endif
為
#if defined(BUILDING_WEBKIT)
#define TESTSUPPORT_EXPORT /*Q_DECL_EXPORT*/
#else
#define TESTSUPPORT_EXPORT /*Q_DECL_IMPORT*/
#endif
然后重新執行上面的命令。
最后執行下面的命令,將生成的libs和頭文件放到
D:\qt-static-build\Qt5.4.2-static-vs2013
里面
cd F:\QT\qt-everywhere-opensource-src-5.4.2\qtwebkit\WebKitBuild\Debug
nmake install
至此,整個Qt和QWebKit已經編譯完成。
我將文件組織了下
在
D:\qt-static-build\Qt5.4.2-static-vs2013
里面新建目錄 thirdpart 將上面的icu和ssl文件夾復制到里面,然后新建webkit目錄,將webkit用到的庫復制到里面
如圖:

靜態編譯后的文件我已經上傳到我的網盤了,大家可自行去下載。
http://pan.baidu.com/s/1mhquqSC
下面來新建項目測試一下
添加環境變量
變量名:
QTDIR-STATIC
變量值:
D:\qt-static-build\Qt5.4.2-static-vs2013
用VS2013創建項目
1、打開VS2013,文件 -> 新建項目 -> 模塊 -> Visual C++ -> Win32 -> Win32 項目,輸入項目名稱QtStaticTest,點擊確定按鈕,創建一個新項目。然后在Win32 應用程序向導里面選擇新項目,點擊完成。如圖:

2、修改項目屬性,右擊 項目 -> 屬性,打開屬性頁面。
配置屬性 -> C/C++ -> 常規 附加包含目錄,修改為
$(QTDIR-STATIC)/include,如圖:

配置屬性 -> C/C++ -> 代碼生成 運行庫,改為MTd
,如圖:

配置屬性 ->
鏈接器 -> 常規 附加庫目錄,添加
$(QTDIR-STATIC)\lib
$(QTDIR-STATIC)\plugins\platforms
$(QTDIR-STATIC)\plugins\imageformats
$(QTDIR-STATIC)\plugins\bearer
$(QTDIR-STATIC)\thirdpart\icu\lib
$(QTDIR-STATIC)\thirdpart\ssl\lib
$(QTDIR-STATIC)\thirdpart\webkit\lib
,如圖:

配置屬性 ->
鏈接器 -> 輸入 附加依賴項,添加以下內容:
/OPT:REF
qtmaind.lib
Qt5Cored.lib
Qt5Guid.lib
Qt5Widgetsd.lib
Qt5PlatformSupportd.lib
Qt5OpenGLd.lib
Qt5WebKitd.lib
Qt5WebKitWidgetsd.lib
Qt5MultimediaWidgetsd.lib
Qt5PrintSupportd.lib
Qt5Networkd.li
Qt5Sensorsd.lib
Qt5Sqld.lib
Qt5Positioningd.lib
Qt5Multimediad.lib
qwindowsd.lib
qddsd.lib
qicnsd.lib
qicod.lib
qjp2d.lib
qmngd.lib
qtgad.lib
qtiffd.lib
qwbmpd.lib
qwebpd.lib
WebKit1d.lib
WebCored.lib
version.lib
ANGLEd.lib
leveldbd.lib
JavaScriptCored.lib
WTFd.lib
sicuind.lib
sicuucd.lib
sicudtd.lib
winspool.lib
shlwapi.lib
rpcrt4.lib
comdlg32.lib
oleaut32.lib
imm32.lib
winmm.lib
glu32.lib
opengl32.lib
gdi32.lib
qtharfbuzzngd.lib
qgenericbearerd.lib
qnativewifibearerd.lib
dnsapi.lib
crypt32.lib
kernel32.lib
user32.lib
shell32.lib
uuid.lib
ole32.lib
advapi32.lib
ws2_32.lib
mpr.lib
qtmaind.lib
Qt5Cored.lib
Qt5Guid.lib
Qt5Widgetsd.lib
Qt5PlatformSupportd.lib
Qt5OpenGLd.lib
Qt5WebKitd.lib
Qt5WebKitWidgetsd.lib
Qt5MultimediaWidgetsd.lib
Qt5PrintSupportd.lib
Qt5Networkd.li
Qt5Sensorsd.lib
Qt5Sqld.lib
Qt5Positioningd.lib
Qt5Multimediad.lib
qwindowsd.lib
qddsd.lib
qicnsd.lib
qicod.lib
qjp2d.lib
qmngd.lib
qtgad.lib
qtiffd.lib
qwbmpd.lib
qwebpd.lib
WebKit1d.lib
WebCored.lib
version.lib
ANGLEd.lib
leveldbd.lib
JavaScriptCored.lib
WTFd.lib
sicuind.lib
sicuucd.lib
sicudtd.lib
winspool.lib
shlwapi.lib
rpcrt4.lib
comdlg32.lib
oleaut32.lib
imm32.lib
winmm.lib
glu32.lib
opengl32.lib
gdi32.lib
qtharfbuzzngd.lib
qgenericbearerd.lib
qnativewifibearerd.lib
dnsapi.lib
crypt32.lib
kernel32.lib
user32.lib
shell32.lib
uuid.lib
ole32.lib
advapi32.lib
ws2_32.lib
mpr.lib
這里面有的庫,可能用不到,大家可自行刪除。
如圖:

3、新建文件main.cpp。添加以下內容:
#include <QtWidgets/QApplication> #include <QtWidgets/QPushButton> #include <QtWidgets/QMainWindow> #include <QtWebKitWidgets/QWebView>
#ifdef QT_STATIC #include <QtCore/QtPlugin> Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin) Q_IMPORT_PLUGIN(QDDSPlugin) Q_IMPORT_PLUGIN(QICNSPlugin) Q_IMPORT_PLUGIN(QICOPlugin) Q_IMPORT_PLUGIN(QJp2Plugin) Q_IMPORT_PLUGIN(QMngPlugin) Q_IMPORT_PLUGIN(QTgaPlugin) Q_IMPORT_PLUGIN(QTiffPlugin) Q_IMPORT_PLUGIN(QWbmpPlugin) Q_IMPORT_PLUGIN(QWebpPlugin) Q_IMPORT_PLUGIN(QGenericEnginePlugin) Q_IMPORT_PLUGIN(QNativeWifiEnginePlugin) #endif // QT_STATIC
int main(int argc, char *argv[]) { QApplication app(argc, argv);
QMainWindow* window = new QMainWindow(); window->resize(500, 450);
QPushButton* btn = new QPushButton(window); btn->setText("Hello World!"); btn->setGeometry(10, 10, 80, 20);
QWebView* webView = new QWebView(window); webView->setGeometry(100, 15, 350, 420); webView->setUrl(QUrl("http://www.163.com"));
window->show();
return app.exec(); }
運行,如圖:

好了,一個Hello World已經成功運行了。
注意一點,用到的Plugins要通過Q_IMPORT_PLUGIN,導入進去。否則的話就會報錯了。
有人會問,上面要引用那么多lib文件我是怎么知道的,其實我是先通過QtCreator創建一個項目,成功編譯並運行后,通過命令
qmake -r -spec win32-msvc2013 -tp vc 轉化為VS2013項目,然后啟動后,查看項目屬性才知道的。